PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как реализовать рекурсивный обход категорий магазина?

Здравствуйте, стоит задача спарсить данные с удаленного сайта.
Там есть страница с категориями 1ого уроаня, при нажатии на какую-то категрию ты попадаешь на страницу с категориями 2ого уровня и так далее.
по идее вложенность примерно такая
Балкон и сад
	Грили
	Зонты
		Балконные экраны
		Зонты от солнца и основания для зонтов
		Шатры и тенты
			Шатры
			Тенты
	Кашпо и растения для сада
		Растения
		Шпаллеры
Ванная
...


я хочу написать функция котороя вернула бы мне массив согласно эти категориям
$result = [
    [
        'name' => 'Грили',
        'link' => 'url/url/url/',
        'dirs' => [
            [
                'name' => 'Грили декоративные',
                'link' => 'url/url/url/',
                'dirs' => []
            ],
            [
                'name' => 'Грили латунные',
                'link' => 'url/url/url/',
                'dirs' => []
            ]
        ]
    ],
    [...]
];


для этого я хочу написать рекурсивую функцию, которая бы обходила каждый найденный адрес и строила массив по примеру выше, но у меня не выходит это сделать, не могли бы вы помочь, возможно накидать ссылок, где понятно объясняют алгоритмы рекурсии, можно даже не на php, а на каком-нибдуь псевдо коде

вот мой код, но не не работает.

$result = [];
$topCats = getItemsCategory($document, $result); // передаю страницу с категориями верхнего уровня

function getItemsCategory(phpQueryObject $document, &$result)
{

    $childrens = pq($document)->find('.range-catalog-list__link')->elements;
    if ($childrens) { // есть потомки
        foreach ($childrens as $item) {
            $name = trim(pq($item)->find('.range-catalog-list__title')->text());
            $link = trim(pq($item)->attr('href'));

            if ($doc = phpQuery::newDocumentHTML(getSslPage($link)))
                $arReturn[]['dirs'] = getItemsCategory($doc);

            return [
                'name' => $name,
                'link' => $link,
            ];
        }
    } else { // нет потомков
        return [];
    }
}
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
hack504
@hack504
Как-то так можно попробовать
$doc = new DOMDocument();
$doc->loadHTML($html);
$output = array();
showDOMNode($doc, $output );


function showDOMNode(DOMNode $domNode, $output) {
$i = 1;
    foreach ($domNode->childNodes as $node)
    {
        $output[$i] = array('name'=>$node->nodeName, 'value'=> $node->nodeValue, 'dirs'=> array());
        if($node->hasChildNodes()) {
            showDOMNode($node, $output[$i]['dirs']);
        }
        $i++;
    }    
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы