У меня есть иерархия узлов, хранящихся в БД. Я выбираю все, сохраняю их в массиве, затем перебираю их и создаю вложенный массив в памяти.
Вход выглядит так:
[{имя: A}, {имя: B}, {имя: X, родитель: A}, {имя: Y, родитель: A}, {имя: C}]
Вывод выглядит так:
[{name: A, дети: [{name: X}, {name: Y}]}, {B}, {C}]
Нет предела тому, насколько глубоко может быть вложенность.
Проблема, с которой я столкнулся, заключается в том, что если одна из записей имеет недопустимую родительскую ссылку, она не может быть помещена в иерархию, и скрипт завершается бесконечным циклом, пытаясь найти родителя.
Могу поспорить, что есть способ узнать, когда я попал в бесконечный цикл. Для записи, когда в цикле я понимаю, что нет родительского элемента, в который можно вставить элемент, я помещаю элемент в конец массива, потому что родительский элемент может существовать вниз по строке.
Полагаю, мне удастся понять, что я снова и снова повторяю одни и те же вещи?
Редактировать 1 - код
Это важный бит:
$cnt = count($array);
do {
$item = array_shift($array);
if ($this->push($item)) {
$cnt--;
} else {
array_push($array, $item);
}
} while ($cnt > 0);
($ this-> push () - это метод, который пытается найти родителя и, в случае успеха, вставляет $ item в его иерархию)