Страницы

Поиск по вопросам

суббота, 9 марта 2019 г.

Формирование правильного массива

Всем привет! Уважаемое сообщество, помогите, зашел в тупик :(. Расскажу с начало суть того что я делаю. 1) Создание DOM из URL с помощью библиотеки PHP Simple HTML DOM Parser Manual. include ('SimpleHTMLDOM/simple_html_dom.php'); $html = file_get_html('http://fondbirzha.ru'); 2) Получение наименования публикации $array_nameNews = array(); foreach($html->find('div.narrow_column div h2 a') as $element) { $nameNews = $element->innertext; $nameNews = iconv( "UTF-8", "windows-1251", $nameNews);
// наполняем массив $array_nameNews[] = $nameNews; } 3) Получение даты публикации $array_dateNews = array(); foreach($html->find('div.narrow_column div div.postdate') as $element) { $dateNews = $element->innertext; // меняем кодировку $dateNews = iconv( "UTF-8", "windows-1251", $dateNews); // Обрезаем полученную дату вида "Опубликовано Ноябрь 26th, 2012 Автор Анастасия" $dateNews = preg_replace('/^(.*?\s)(.*?\s.*?,\s.*?\s)(.*?\s.*?)$/', '$2', $dateNews); // Уберем лишние символы "st," и "th," $dateNews = preg_replace('/^(.*?\s)(\d{1,2})(st,|th,)(\s\d{4})/', '$1$2$4', $dateNews);
// Поскольку название месяца получаем на русском языке, а дату для вставки в инфоблок необходимо представить в формате дд.мм.гггг создаем два шаблона $searchPattern и $replacePattern $searchPattern = array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"); $replacePattern = array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
// Заменяем русское название месяца на английское $newFormatDate = str_replace($searchPattern, $replacePattern, $dateNews);
// Преобразовываем строку в дату и приводим к виду "d.m.Y" $dateres = date("d.m.Y", strtotime($newFormatDate));
// наполняем массив $array_dateNews[] = $dateres; } 4) Получение полного описания публикации foreach($html->find('div.narrow_column div div.entry p.postinfo') as $tmp)$tmp->outertext = ''; // из результата делаем новый отбор if(count($html->find('div.narrow_column div div.entry'))){ // Ищем полное описание новости // похожий принцип отбора селекторов как в jQuery, в нашем случае ищем "div.narrow_column div div.entry" $array_textNews = array(); foreach($html->find('div.narrow_column div div.entry') as $element) { $contentNews = $element->outertext; $contentNews = iconv( "UTF-8", "windows-1251", $contentNews);
// наполняем массив $array_textNews[] = $contentNews; } } 5) РЕАЛИЗУЕМ СРАВНЕНИЕ ДВУХ МАССИВОВ - для чего? Вот собственно для того, чтобы отсечь совпадение записей в БД и новых которые получили с сайта http://fondbirzha.ru/. Сравнение я делал по имени публикации. $total = $result;
$totalArr = Array();
for ($i = 0; $i <= $total; $i++) { /* Берем первый элемент массива $array_nameNews и сравниваем его с каждым элементом массива $secondArr, если схождение найдено тогда берем следующий элемент массива $array_nameNews и снова ищем схождение, если схождение ненайдено значит помещаем этот элемент в новый массив */
$firstCharArr = array($array_nameNews[$i]);
$result = array_diff($firstCharArr, $secondArr);
if ($result) { $a = $result;
foreach($result as $key => $values){ $arResult = Array(); $arResult['NAME'] = $values; } array_push($totalArr, $arResult['NAME']); } } 6) Теперь после того как сравнили два массива мы получили третий массив и его нужно вставить в БД, но тут одно НО, поскольку сравнивал я имена массивов значит мне нужно получить теперь полное описание публикации, т.е. каждому элементу массива с именем присоединить ДАТУ и ПОЛНОЕ ОПИСАНИЕ, и каждому свое соответственно, вот здесь то я зашел в тупик. Я этот функционал сделал, и он работает, но неверно, он берет и подставляет неверное значение, т.е. просто тупо по порядку, а мне нужно каждому и соответствующее значение. $formatted = array();
// Создаем массив с данными полученный путем отбора необходимой нам информации foreach ($totalArr as $key => $news) { $one_piece = array(); $one_piece['NAME'] = $news; $one_piece['DATE'] = $array_dateNews[$key]; $one_piece['TEXT'] = $array_textNews[$key]; $formatted[] = $one_piece; } Коллеги, помогите пожалуйста, заранее благодарен!!!


Ответ

$key в последнем сегменте не указывает на соответствующий элемент в $array\_dateNews и $array\_textNews. Это просто индекс от 0 до count($totalArr)-1. Полагаю название, дату и описание нужно хранить в одном массиве. А еще array\_diff справится с вычитанием и без цикла: array\_diff($array\_nameNews, $secondArr)

Комментариев нет:

Отправить комментарий