Функция возвращает только 1 элемент из 16

Программирование, которое не связано с API.
Ответить
nick88hello
Сообщения: 4
Зарегистрирован: 03 дек 2012, 09:43

Функция возвращает только 1 элемент из 16

Сообщение nick88hello »

Этот скрипт парсит данные из html-страницы данные с помощъю библиотеки simple html dom . Как только он находит на странице <td class="detail"> , забирает из него данные и возвращает массив , а если не находит возвращает false.

Данный фрагмент кода рабочий , если его не описывать как функцию . Но , реализованный в виде функции , работает не так как надо - возвращает данные из <td class="detail"> только из одного блока , а их в странице "page.html " целых 16.

Код: Выделить всё

 <?php//Подкл. библиотеку//Подробнее о библиотеке здесь : http://simplehtmldom.sourceforge.net/manual.htminclude('simple_html_dom.php');function ExtractContent(){/*Данные берутся из сохр. html-страницы , находящейся втом же каталоге что и скрипт*/$html = file_get_html('page.html');//Если находим необходимый блок кода <td class="detail"> - продолжаем работу     if($tag = count($html ->find('td.detail')) != 0){             $i = 0;             $item = array();             foreach($html ->find('td.detail') as $element){/*$element->outertext   Читает или записывает весь HTML элемента, включая его самого.$element->innertext   Читает или записывает внутренний HTML элемента$element->plaintext   Читает или записывает простой текст элемента*/    // Найти все <div> с классом title               $item[$i]['title'] = $element->find('div.title',0)->plaintext;// Найти все ссылки в <div> с классом title и извлечь из ссылки атрибут href             $item[$i]['link'] =  $element->find('div.title a',0)->href;//Найти все параграфы             $item[$i]['description'] =  $element->find('p',0)->plaintext;// Найти <div class="uah">             $item[$i]['cost-uah'] = $element->find('div.uah',0)->plaintext;// Найти <div class="usd">             $item[$i]['cost-usd'] = $element->find('div.usd',0)->plaintext;             $i++;                          return $item;             }//Очистка памяти(рекомендуется делать)         $html->clear();//Удаление переменной         unset($html);    }//Сюда попадаем ,если <td class="detail"> не был найден      else{           $html->clear();           unset($html);           return false;         } }   $content = ExtractContent();print_r($content);?> 
Исходники
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Функция возвращает только 1 элемент из 16

Сообщение Александр »

nick88hello
Искать место где что-то идет не так как ожидалось.

Код: Выделить всё

echo count($html ->find('td.detail'));foreach($html ->find('td.detail') as $element){ print_r($element);}
nick88hello
Сообщения: 4
Зарегистрирован: 03 дек 2012, 09:43

Re: Функция возвращает только 1 элемент из 16

Сообщение nick88hello »

Александр , пробовал уже . Если print_r() запускать внутри foreach () происходит зацикливание .
Примечательно , но в таком виде код работает :

Код: Выделить всё

 <?php include('simple_html_dom.php');$html = file_get_html('page.html');if($tag = count($html ->find('td.detail')) != 0){ $i = 0;$item = array();             foreach($html ->find('td.detail') as $element){             $item[$i]['title'] = $element->find('div.title',0)->plaintext;            $item[$i]['link'] =  $element->find('div.title a',0)->href;            $item[$i]['description'] =  $element->find('p',0)->plaintext;            $item[$i]['cost-uah'] = $element->find('div.uah',0)->plaintext;            $item[$i]['cost-usd'] = $element->find('div.usd',0)->plaintext;             $i++;             }            $html->clear();            unset($html);            }else{            $html->clear();            unset($html);}print_r($item);?> 
Здесь что-то не так с переменной $i , с ее помощью создаются индексы для нов. элементов .Вобщем , есть еще какие-то версии ?
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Функция возвращает только 1 элемент из 16

Сообщение Александр »

nick88hello
return $item; - возвращает первый же return как результат работы функции.
Сначала собрать всё что нужно в одну переменную, потом сделать return.
nick88hello
Сообщения: 4
Зарегистрирован: 03 дек 2012, 09:43

Re: Функция возвращает только 1 элемент из 16

Сообщение nick88hello »

Александр, благодарю надо было переставить return за пределы цикла - все работает . Можно закрывать тему.
Ответить