Warderino
@Warderino

В чем может быть проблема(массив, foreach)?

Доброго времени суток!
Я парсю матчи, и все вроде бы отлично. Вот начал тестить код, и наткнулся на проблему. Суть в том, что когда получается так, что в массиве 1 запись(о матче), то он не записывается в БД, если их будет 2 и более то все нормально. Да и вообще как-то странно ведет себя первая запись в массиве(о матче). Может я перемудрил где-то?
(файл запускается по расписанию)
<?php
use DiDom\Document;
class Task_VKparse extends Minion_Task {

    protected static $_timeout = 1;

    protected function _execute(array $params) {

        //Получаем id матчей
        $html = new Document('http://www.gosugamers.net/dota2/gosubet', TRUE);
        $elements = $html->find('div.box')[0]->find('table tbody tr');
        $matches = array();

        foreach ($elements as $el) {
            $gg_link = $el->find('td a')[0]->attr('href');
            //Преобразование данных
            $match = array(
                'gg_link' => $gg_link,
            );
            $matches[] = $match;
        }


        // Переход на страницу матча
        foreach ($matches as $match) {
            // Получение html кода страницы матча
            $html = new Document('http://www.gosugamers.net' . $match['gg_link'], TRUE);

            $format = $html->find('p.bestof')[0]->text();
            $streams = $html->find('span.match-stream-tab');

            $match['format'] = (new GG)->format($format);
            $match['team1'] = $html->find('div.opponent1 h3')[0]->text();
            $match['team2'] = $html->find('div.opponent2 h3')[0]->text();
            $match['tournament'] = $html->find('fieldset legend a')[0]->text();
            $match['stream_ru'] = (new GG)->stream_ru($streams);
            $match['stream_en'] = (new GG)->stream_en($streams);
            // Занесение полученных данных в массив
            $matches[] = $match;
            // Minion_CLI::write(var_dump($matches));

        }

        // Запись результата в БД
       foreach ($matches as $match) {
            $match_orm = new Model_Match;

            // Загрузка матча, если он уже есть в БД
            $match_orm->where('gg_link', '=', $match['gg_link'])->find();

            // Внесение новых данных о матче
            $match_orm->values($match);

           $match_orm->save();
        }
    }

}
  • Вопрос задан
  • 477 просмотров
Пригласить эксперта
Ответы на вопрос 2
Выше написан гавно-код. Массив $matches заполняется в двух массивах, разными данными. Используйте разные переменные или обнуляйте перед использованием. И вообще трассируйте переменную на каждом этапе, проверяйте какие данные хранятся в переменной.
Ответ написан
Комментировать
cimmwolf
@cimmwolf
Веб-разработчик
По всей видимости вам нужно во втором foreach дополнять существующие элементы массива информацией со страницы матча. Вы же добавляете информацию о матче в конец массива $matches.

Чтобы менять текущий элемент массива в цикле foreach вам нужно добавить передачу элемента массива в foreach по указателю и немного изменить код. Я думаю, что вот так он заработает:
<?php
use DiDom\Document;
class Task_VKparse extends Minion_Task {

    protected static $_timeout = 1;

    protected function _execute(array $params) {

        //Получаем id матчей
        $html = new Document('http://www.gosugamers.net/dota2/gosubet', TRUE);
        $elements = $html->find('div.box')[0]->find('table tbody tr');
        $matches = array();

        foreach ($elements as $el) {
            $gg_link = $el->find('td a')[0]->attr('href');
            //Преобразование данных
            $match = array(
                'gg_link' => $gg_link,
            );
            $matches[] = $match;
        }


        // Переход на страницу матча
        foreach ($matches as &$match) {
            // Получение html кода страницы матча
            $html = new Document('http://www.gosugamers.net' . $match['gg_link'], TRUE);

            $format = $html->find('p.bestof')[0]->text();
            $streams = $html->find('span.match-stream-tab');

            $match['format'] = (new GG)->format($format);
            $match['team1'] = $html->find('div.opponent1 h3')[0]->text();
            $match['team2'] = $html->find('div.opponent2 h3')[0]->text();
            $match['tournament'] = $html->find('fieldset legend a')[0]->text();
            $match['stream_ru'] = (new GG)->stream_ru($streams);
            $match['stream_en'] = (new GG)->stream_en($streams);
            
            // Minion_CLI::write(var_dump($matches));

        }

        // Запись результата в БД
       foreach ($matches as $match) {
            $match_orm = new Model_Match;

            // Загрузка матча, если он уже есть в БД
            $match_orm->where('gg_link', '=', $match['gg_link'])->find();

            // Внесение новых данных о матче
            $match_orm->values($match);

           $match_orm->save();
        }
    }

}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы