SIMPLE HTML DOM и рекурсивная сборка

87
13 декабря 2021, 14:30

Как с помощью simple_html_dom производить поиск и рекурсивную сборку?

Как из этой HTML структуры:

<ul class="comments">
    <li>
        <span>Comment #1</span>
    </li>
    <li>
        <span>Comment #2</span>
        <ul class="children">
            <li>
                <span>Child Comment #1</span>
                <ul class="children">
                    <li>
                        <span>SubChild Comment #1</span>
                        <ul class="children">
                            <li>
                                <span>SubSubChild Comment #1</span>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

Получить вот такой массив?

[{
    'comment' => 'Comment #1',
}, {
    'comment' => 'Comment #2',
    'childrens' => [{
        'comment' => 'Child Comment #1',
        'childrens' => [{
            'comment' => 'SubChild Comment #1',
            'childrens' => [{
                'comment' => 'SubSubChild Comment #1'
            }]
        }]
    }]
}]

Пробовал собирать каждый раз проходя по массиву, но в итоге получилось так, что внутри цикла расплодилось ещё 4 цикла. Подскажите пожалуйста, буду ПРЕМНОООООГО благодарен!

Answer 1

Если вы говорите про рекурсию, то откуда же у вас 4 цикла?

вот ваши входные

$html = <<<HTML
<ul class="comments">
    <li>
        <span>Comment #1</span>
        <ul class="children">
          <li><span>#1-1</span></li>
        </ul>
    </li>
    <li>
        <span>Comment #2</span>
        <ul class="children">
            <li>
                <span>Child Comment #1</span>
                <ul class="children">
                    <li>
                        <span>SubChild Comment #1</span>
                        <ul class="children">
                            <li>
                                <span>SubSubChild Comment #1</span>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>
HTML;

загружаете документ, находите верхний узел и определяете объект для результатов

$html = str_get_html($html);
$c = $html->find(".comments", 0);
$result = [ ];

и рекурсивная функция обхода

$search = function($ul, &$res) use (&$search){
            foreach($ul->children() as $li){        
                $r['comment'] = $li->find("span", 0)->text();
                $sub = $li->find(".children", 0);
                if($sub){
                    $r['children'] = [];
                    $search($sub, $r['children']);
                }
                $res[] = $r;
            }
        };

на вход функции подается ul список. В цикле вы обходите непосредственные дочерние li ($ul->children()).
На каждой итерации собираете коммент $r, сам текст, и проверяете, есть ли дочерние .children ($sub). Если есть, то добавляете $r['children'] и запускаете рекурсию.

вызываете метод и смотрите результат

$search($c, $result);
echo json_encode($result, JSON_PRETTY_PRINT);

который будет таким

[
    {
        "comment": "Comment #1 ",
        "children": [
            {
                "comment": "#1-1 "
            }
        ]
    },
    {
        "comment": "Comment #2 ",
        "children": [
            {
                "comment": "Child Comment #1 ",
                "children": [
                    {
                        "comment": "SubChild Comment #1 ",
                        "children": [
                            {
                                "comment": "SubSubChild Comment #1 "
                            }
                        ]
                    }
                ]
            }
        ]
    }
]
READ ALSO
Yii2 | Получение данных с модели

Yii2 | Получение данных с модели

День добрыйНачал изучать yii2

154
Перенаправление и кодировка

Перенаправление и кодировка

есть одностраничник в котором есть форма по типу "оставить заявку" к которой в свою очередь привязан следующий  php скрипт :

349
PHP CURl без внешки

PHP CURl без внешки

В нашей стране очень ограничен внешний трафик либо частенько отваливаетсяЕсть сервер внутренний, NGINX

180
Вывод элементов массива в таблицу(php)

Вывод элементов массива в таблицу(php)

Нужно , чтобы колонки соотвествовали значениям , к примеру в колонке возраст только ячейки с возрастом и тд

177