Страницы

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

среда, 22 января 2020 г.

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

#массивы #php


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

Коллеги, помогите пожалуйста, заранее благодарен!!!    


Ответы

Ответ 1



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

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

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