Помещение переменных simple_html_dom в массив

Я пытаюсь извлечь некоторую информацию с веб-сайта, используя simple_html_dom.

В настоящее время я использую:

foreach ($html->find('div.product') as $results) {
    foreach ($results->find('div.image') as $img) {
        echo $img;
    }
    foreach ($results->find('a.title') as $title) {
        echo $title->plaintext;
    }
    foreach ($results->find('div.price') as $price) {
        echo $price;
    }
}

Который отлично работает. Однако мне нужно иметь возможность повторять каждую переменную за пределами цикла foreach. Если я сделаю это, используя приведенный выше код, будет отображаться только окончательный результат, т.е. из 10 продуктов, которые я пытаюсь извлечь, будет отображаться только 10-й.

Есть ли способ использовать массив для хранения всех результатов каждого цикла foreach, а затем вывести их после завершения общего цикла?

Что-то вроде этого:

foreach ($html->find('div.product') as $results) {
    foreach ($results->find('div.image') as $img) {
        array($img);
    }
    foreach ($results->find('a.title') as $title) {
        array($title->plaintext);
    }
    foreach ($results->find('div.price') as $price) {
        array($price);
    }
}
echo array($img);
echo array($title);
echo array($price);

Извините, если этот вопрос сбивает с толку, я плохо разбираюсь в PHP, особенно в массивах!


person magicPenguin    schedule 31.01.2012    source источник
comment
пожалуйста, предоставьте образец html для анализа   -  person Bogdan    schedule 31.01.2012
comment
(ссылка) php.net/arrays   -  person Gordon    schedule 31.01.2012
comment
и вы понимаете, что $results->find уже возвращает массивы, верно?   -  person Gordon    schedule 31.01.2012
comment
Я использовал это: $html = file_get_html('amazon.co.uk/s/);   -  person magicPenguin    schedule 31.01.2012
comment
Нет, извините, я этого не сделал. Я никогда раньше не работал с PHP на таком уровне, поэтому прошу прощения, если вопрос покажется глупым.   -  person magicPenguin    schedule 31.01.2012


Ответы (4)


$images = array();
foreach ($html->find('div.product') as $results) {
    foreach ($results->find('div.image') as $img) {
        $images[] = $img; // append $img to the $images array
    }
}

var_dump($images);

Сделайте то же самое для заголовка и данных о цене.

person Marc B    schedule 31.01.2012
comment
Спасибо за ответ. Это выводит сотни строк кода, похожих на этот массив (15) { [0] => object (simple_html_dom_node) # 653 (9) { [nodetype] => int (1) [tag] => string (3) div Is есть способ отображать только изображения? Большое спасибо. - person magicPenguin; 31.01.2012
comment
Какие образы? Ваш find() не ищет изображения, он ищет div с изображением класса css. - person Marc B; 31.01.2012
comment
Также, если это поможет, я использую этот html: $html = file_get_html('amazon.co.uk/s/); - person magicPenguin; 31.01.2012
comment
Да, я знаю, он ищет этот div, а затем извлекает все, что находится в этом div, что в данном случае является фактическим изображением. - person magicPenguin; 31.01.2012
comment
Если у вас нет больше кода, чем показано выше, то нет, он не извлекает изображения. Он ищет только <div class="image"> и возвращает соответствующие узлы DOM. - person Marc B; 31.01.2012
comment
Он отображает изображения, когда я повторяю $img. Изображение не так уж важно, все, что я хотел сделать, это иметь возможность отображать каждую переменную за пределами основного цикла foreach, что делает ваш код, однако он возвращает много строк кода, которые я не знаю. не хочу. Если вы дадите мне несколько минут, и вы не возражаете, я могу загрузить то, что у меня есть сейчас, на сервер, чтобы показать вам, что я вижу? - person magicPenguin; 31.01.2012
comment
Это из var_dump, который просто выгружает то, что находится в массиве. Фактический код отображения зависит от вас, чтобы добавить его. Однако обратите внимание, что, поскольку вы извлекаете элементы div из исходного дерева, вы на самом деле выводите такие вещи, как <div class="image"><img src="..."></div>, а не только изображения. - person Marc B; 31.01.2012
comment
Хорошо, это объясняет, я попробую это сделать. Приносим свои извинения за отнятое время и большое спасибо за помощь. - person magicPenguin; 31.01.2012

Не уверен, что полностью понимаю ваш вопрос, попробуйте следующее.

$priceList = $titleList = $imgList = array();

foreach ($html->find('div.product') as $results) {<br/>
    foreach ($results->find('div.image') as $img) {<br/>
        $imgList[] = $img;<br/>
    }<br/>
    foreach ($results->find('a.title') as $title) {<br/>
        titleList[] = $title;<br/>
    }<br/>
    foreach ($results->find('div.price') as $price) {<br/>
        priceList[] = $price;<br/>
    }<br/>
}<br/>
foreach ($imgList as $img) {<br/>
        echo $img;<br/>
}<br/>

И так далее...

person Paul Wojnarowicz    schedule 31.01.2012

person    schedule
comment
Спасибо за ответ. Я могу видеть данные, которые мне нужны, используя эту опцию, однако она возвращает сотни строк кода вокруг них. Есть ли способ извлечь только конкретную информацию. - person magicPenguin; 31.01.2012
comment
Если это поможет, я использую этот html: $html = file_get_html('amazon.co.uk/s/); - person magicPenguin; 31.01.2012
comment
Когда я использовал первый блок кода в своем вопросе, я получал фактическое изображение продукта, название и цену. Однако, когда я использую print_r($array_img), я получаю много нежелательных строк кода. - person magicPenguin; 31.01.2012
comment
вы должны использовать ключи для эхо-специфической информации, которую вы хотите использовать, например $array_price[0], проверьте руководство по массивам с php.net php: Массивы - person Ali Demirci; 31.01.2012

person    schedule
comment
Большое спасибо за ответ! - person magicPenguin; 31.01.2012