@9StarRu

Как выполнить проверку внутри foreach?

Пытаюсь сделать рассылку новостей с сайта, новости берутся с сайта по
id и post_key из файла tmp-mailing.json

tmp-mailing.json формируется специально в момент публикации новости на сайте для того, чтобы потом сделать рассылку.
Проблема в том, что если с сайта удалить новость до рассылки, id и post_key останутся в файле tmp-mailing.json но фактически на сайте будет отсутствовать из-за чего скрипт рассылки прекращает работу и отдает 500 ошибку. Так как пытается получить новость, которой нет.

Ниже мой код, пожалуйста, помогите обойти эту проблему, например, сделать так, чтобы в случае отсутствия новости на сайте, скрипт просто пропускал ее и шел дальше в поисках существующих на сайте новостей id и post_key.

Я так понял, что нужно отредактировать код внутри foreach, возможно ошибаюсь.

//Рассылка на Email
if($this->isEnabledService('mailing')){
    if(Filesystem::fileExists($this->workspace().'/tmp-mailing.json')){
        $mailing_posts = $this->helper('workspace')->select('tmp-mailing');
        $posts = $mailing_posts->getData();

        $mail_template = html_entity_decode($this->getSettingField('mailing_settings', 'mail_template'));
        $mailing_days = explode(',', $this->getSettingField('mailing_settings', 'interval'));
        $reply_to = $this->getSettingField('mailing_settings', 'reply_to');

        // Проверяем интервал
        if(in_array(date('N'), $mailing_days)){
            $readyPosts = '';
            $mp_i = 0;

            $posted_ids = [];

            foreach ($posts as $key => $mailingPost){
                $posted_ids[] = $mailingPost->id;
                $page = buildPage($mailingPost->post_key);

                $image = $page->thumbCoverImage();

                $readyPosts .= '<div style="align: center;"><a href="'.$page->permalink().'"><h1>'.$page->title().'</h1></a></div>';
            }

            $result_mailing = $this->manageServerRequest('mailing', [
                'mail_template' => $mail_template,
                'mail' => [
                    'from' => 'mail',
                    'subject' => 'Наша рассылка',
                    'html' => $readyPosts,
                    'reply-to' => $reply_to
                ]
            ]);

            if($result_mailing->status === true){
                $mailing_posts->delete();
                foreach ($posted_ids as $posted_id) {
                    $this->addPosted($posted_id, 'mailing');
                    $this->log([
                        'id' => $posted_id,
                        'service' => 'mailing',
                        'status' => 'success',
                        'message' => $result_mailing->message,
                        'params' => []
                    ]);
                }

            }else{
                echo 'Что-то пошло не так'.PHP_EOL.$result_mailing->message;
            }
        }

    }

}


Workspace
class WorkspaceHelper{

    private $filePath;
    private $suffix = '.json';

    public $workspace;

    public function select($filename)
    {

        $this->filePath = $this->workspace.$filename.$this->suffix;

        if(!Filesystem::fileExists($this->filePath)){
            fclose(fopen($this->filePath,'x'));
        }

        return $this;
    }

    public function insert(array $data)
    {
        $data = (object) $data;

        $old_data = $this->getData();
        $old_data[] = $data;

        return file_put_contents($this->filePath, json_encode($old_data)) OR false;
    }

    public function is_exist(array $find)
    {
        $find = (object) $find;

        $old_data = $this->getData();

        foreach ($old_data as $oldData)
        {
            foreach ($find as $find_key => $find_val){
                if(isset($oldData->$find_key) && $oldData->$find_key == $find_val){
                    return $oldData;
                }
                continue;
            }
        }

        return false;

    }

    public function insertIfNotExists(array $find, array $data)
    {
        $data = (object) $data;

        $old_data = $this->getData();

        foreach ($old_data as $oldData)
        {
            foreach ($find as $find_key => $find_val){
                if(isset($oldData->$find_key) && $oldData->$find_key == $find_val){
                    return false;
                }
                continue;
            }
        }

        $old_data[] = $data;

        return file_put_contents($this->filePath, json_encode($old_data)) OR false;
    }

    public function update($searchKey, $searchValue, array $replacement)
    {
        $data = $this->getData();
        foreach ($data as $data_key => $data_value) {
            $data_value = (array) $data_value;
            foreach ($data_value as $key => $value) {
                if($searchKey == $key && $searchValue == $value){
                    $data[$data_key] = array_merge($data_value, $replacement);
                }
            }
        }

        return file_put_contents($this->filePath, json_encode($data)) OR false;
    }

    /**
     * Удаляет элемент массива по шаблону поиска
     *
     * @param array $searchArray
     * @return bool
     */
    public function remove(array $searchArray)
    {
        $data = $this->getData();
        foreach ($data as $data_key => $data_value) {
            foreach ($searchArray as $sKey=>$sVal){
                if(isset($data_value->$sKey) && $data_value->$sKey == $sVal) unset($data[$data_key]);
            }
        }

        return file_put_contents($this->filePath, json_encode(array_values($data))) OR false;
    }

    /**
     * Удаляет файл из workspace
     */
    public function delete()
    {
        unlink($this->filePath);
    }

    public function getData()
    {
        return (array) json_decode(file_get_contents($this->filePath));
    }

}
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
@Narts
Скорее всего новости у вас хранятся в бд. Тогда в каждой итерации foreach делайте запрос к бд, а существует ли эта запись. Если нет, то continue;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы