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