Всем привет! Уважаемое сообщество, помогите, зашел в тупик :(. Расскажу с начало суть того что я делаю.
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)
Комментариев нет:
Отправить комментарий