Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Работа парсера с таблицами и массивами
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Работа парсера с таблицами и массивами

Страниц (3): [1] 2 3 »
 

1. Torres90 - 20 Апреля, 2018 - 09:54:20 - перейти к сообщению
Всем привет!
Занимаюсь написанием парсера и обработкой полученной информации.
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = file_get_contents('http://football2.psvb.ru/index11.php');
  3. $str = str_replace('<table class="robobet_psvb_table">','<table class="robobet_psvb_table" id="robobet_psvb_table"><thead></thead><tbody>', $str);
  4. $str = str_replace('</table>','</tbody></table>', $str);
  5. $ids = array('tabke' => 'id="robobet_psvb_table"');
  6. foreach ($ids as $k => $mark) {
  7. // Постепенно отсекаем лишнее, оставляя лишь содержимое <tbody>
  8. $table = strstr($str, $mark, false);
  9. $table = strstr($table, '</table>', true);
  10. $table = strstr($table, '</thead>', false);
  11. // Разбиваем по закрывающему тегу и не забываем удалить лишний кусок в конце.
  12. $cells = explode('</td>', $table, -1);
  13. // Удаляем html разметку и лишние пробелы по краям
  14. array_walk($cells, function(&$n) { $n = trim(strip_tags($n)); } );
  15. // Восстанавливаем структуру в 12 столбцов
  16. $result[$k] = array_chunk($cells, 12); }
  17. print_r($result);
  18.  

Через принт выводится сложный массив. Мне нужно вывести этот массив обратно в таблицу вида <table>, но только нужных мне столбцов, причем в нужном порядке. По этой таблице непонятно зачем мне это нужно, но есть проблемы с таблицами, где заполнены не все поля и этот способ должен их обработать.
Подскажите пожалуйста как правильно вывести нужную информацию.
2. Строитель - 20 Апреля, 2018 - 10:39:51 - перейти к сообщению
Torres90, добавьте пожалуйста к вашему посту дамп массива и структуру html-таблицы.
3. Torres90 - 20 Апреля, 2018 - 11:05:50 - перейти к сообщению
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <table class="table table-bordered table-responsive table-hover">
  3.                 <thead class="table-active">
  4.                   <tr class="col-lg-12">
  5.                     <th scope="col">Дата</th>
  6.                     <th scope="col">Чемпионат</th>
  7.                     <th scope="col">Матч</th>
  8.                     <th scope="col">П1</th>
  9.                     <th scope="col">Х</th>
  10.                     <th scope="col">П2</th>
  11.                     <th scope="col">Прогноз</th>
  12.                     <th scope="col">П1</th>
  13.                     <th scope="col">Х</th>
  14.                     <th scope="col">П2</th>
  15.                   </tr>
  16.                 </thead>
  17.                 <tbody>
  18.                   Парсер, каждый массив второго уровня в td, основнной массив в tr обрамляется
  19.                 </tbody>
  20. </table>
  21.  


Дамп:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. Array ( [tabke] => Array ( [0] => Array ( [0] => [1] => [2] => 2018-04-20 00:30 [3] => Чемпионат Сальвадора [4] => КД Драгон - Луис Анхель Фирпо [5] => 43% [6] => 28% [7] => 29% [8] => 12 [9] => 2.17 [10] => 3.10 [11] => 3.26 ) [1] => Array ( [0] => [1] => [2] => 2018-04-20 00:30 [3] => Чемпионат Гватемалы [4] => Антигуа ГФК - ФК Сухитепекес [5] => 74% [6] => 14% [7] => 12% [8] => П1 [9] => 1.26 [10] => 5.80 [11] => 8.00 ) [2] => Array ( [0] => [1] => [2] => 2018-04-20 01:00 [3] => Чемпионат Сальвадора [4] => Санта Текла II - Альянса II [5] => 27% [6] => 22% [7] => 51% [8] => 12 [9] => 3.44 [10] => 3.60 [11] => 1.82 )))
  3.  

В масиве 12 столбцов, первые два пустые, т.е. их не используем, остальные 10 как раз в поля должны зайти.
4. Строитель - 20 Апреля, 2018 - 12:26:28 - перейти к сообщению
Torres90 пишет:
В масиве 12 столбцов, первые два пустые, т.е. их не используем, остальные 10 как раз в поля должны зайти.
Пустые элементы можно отфильтровать с помощью array_filter(), а сбросить ключи - с помощью array_values(). Пример:

Спойлер (Отобразить)
Совет на будущее - для того, чтобы удобнее было с вашим дампом работать кому-то другому, публикуйте его с помощью var_export()
Спойлер (Отобразить)
5. Torres90 - 20 Апреля, 2018 - 12:33:05 - перейти к сообщению
Строитель пишет:
Пустые элементы можно отфильтровать с помощью array_filter(), а сбросить ключи - с помощью array_values().

А если мне не нужно удалять пустые? В таблице могут быть изначально пустые поля, при парсере они тоже должны писаться в базу и заполняться также пустыми... Сейчас конкретно этого дампа, что я прислал надо просто вырезать первые 2 элемента в каждом подмассиве.

Строитель пишет:
Совет на будущее - для того, чтобы удобнее было с вашим дампом работать кому-то другому, публикуйте его с помощью var_export()

Я до сих пор не понял, что отменя требовалось при добавлении дампа...
6. Строитель - 20 Апреля, 2018 - 12:54:23 - перейти к сообщению
Torres90 пишет:
Сейчас конкретно этого дампа, что я прислал надо просто вырезать первые 2 элемента в каждом подмассиве
Если фильтровать нельзя, тогда нужно выбирать срез массива array_slice(), таким образом отбрасывать первые два элемента в каждом массиве, чтобы получить необходимый размер.
Спойлер (Отобразить)

(Добавление)
Torres90 пишет:
Я до сих пор не понял, что отменя требовалось при добавлении дампа...
Просто распечатайте массив с помощью print_r(); и с помощью echo '<pre>', var_export($result), '</pre>'; и посмотрите, какую из полученных строк можно быстро скопировать и сохранить в переменную для дальнейшей работы с вашим массивом -- так вам станет понятнее.
7. Torres90 - 20 Апреля, 2018 - 13:55:12 - перейти к сообщению
К сожалению у меня не работает вывод. Связано ли это с тем, что информация в массив получается в этом же файле через file_get_contents или может слишком большой размер массива?
Имею ввиду, что из таблицы получаю массив в этом файле, а его сразу же извлекаем?
8. Строитель - 20 Апреля, 2018 - 14:09:10 - перейти к сообщению
Torres90, я на локальном сервере запускал ваш код, всё было ок. Включите отображение ошибок, может быть что-то прояснится.
9. Torres90 - 21 Апреля, 2018 - 11:09:40 - перейти к сообщению
Строитель, спасибо! Все отлично работает, особенно порадовал вывод столбцов в нужных местах! Вчера не получалось видимо из-за того, что правки все делал с телефона.

А есть какой-то способ при парсинге дамп этот записать в файл, чтоб брать данные со своего сервера или это лучше делать с MySQL? Хотелось бы максимально ускорить процесс получения данных, а обновление информации в файле возможно через крон настроить.
10. Строитель - 21 Апреля, 2018 - 11:21:53 - перейти к сообщению
Torres90 пишет:
А есть какой-то способ при парсинге дамп этот записать в файл, чтоб брать данные со своего сервера или это лучше делать с MySQL?
Конечно есть - вместо вывода в браузер сохраняйте массив хоть в файл, хоть в БД.
11. Torres90 - 23 Апреля, 2018 - 09:15:47 - перейти к сообщению
В конец файла парсера вставил такой код:
PHP:
скопировать код в буфер обмена
  1. $fp = fopen("/parser/db.txt", "w+"); // Открываем файл в режиме записи 
  2. $rec = fwrite($fp, $result); // Запись в файл
  3. if ($rec) echo 'Данные в файл успешно занесены.';
  4. else echo 'Ошибка при записи в файл.';
  5. fclose($fp); //Закрытие файла

Естественно записи не происходит, что может быть тут не так. Файл перезаписываться должен при каждом запросе.
12. Строитель - 23 Апреля, 2018 - 09:30:53 - перейти к сообщению
Torres90, у вас в переменной $result массив, поэтому перед записью его нужно обрабатывать serialize(), а после чтения преобразовывать обратно к массиву с помощью unserialize().
13. Torres90 - 23 Апреля, 2018 - 09:53:46 - перейти к сообщению
Строитель
PHP:
скопировать код в буфер обмена
  1. $fp = fopen("/parser/db.txt", "w+"); // Открываем файл в режиме записи 
  2. $rec_arr = serialize($result);
  3. $rec = fwrite($fp, $rec_arr); // Запись в файл
  4. if ($rec) echo 'Данные в файл успешно занесены.';
  5. else echo 'Ошибка при записи в файл.';
  6. fclose($fp); //Закрытие файла

Пока результат тот же... Права на текстовый файл 777. Путь до файла прямой прописан. Читать его буду в отдельном файле, этот будет исключительно автоматически обновлять информацию с полной перезаписью файла.
14. Строитель - 23 Апреля, 2018 - 21:18:40 - перейти к сообщению
Скорее всего у вас ошибка из-за отсутствия директории. Я дописал проверку на существование директории, и её создание в случае отсутствия is_dir($dir) ?: mkdir($dir);, и запустил этот код на локалке - файл создан успешно, и сериализованный массив тоже в этот файл записан:
Спойлер (Отобразить)
15. Torres90 - 24 Апреля, 2018 - 00:00:11 - перейти к сообщению
Строитель, вставил код из примера все заработало, причина как я понял у меня в пути была. Изменил путь в своем, тоже заработало... Однако не понимаю почему прямой путь не заработал... Видимо прописывается не ссылкой как у меня.

 

Powered by ExBB FM 1.0 RC1