Эта тема на forum.dklab.ru


Военный: Как сделать дерево? (Работа с массивами)
Вообщем не могу решить задачку. Я её конечно решу, но вдруг есть уже известные алгоритмы решения подобных задач.
Суть - надо из обычного двумерного массива, создать массив со вложенными массивами, дерево.
Итак есть массив:
Array
(
[osnova] => Array
(
[id] => 1
[predok] => 0
[title] => Самый главный
)

[test1] => Array
(
[id] => 2
[predok] => osnova
[title] => тест1
[child] => Array
)

[test2] => Array
(
[id] => 3
[predok] => osnova
[title] => тест2
)

[test3] => Array
(
[id] => 4
[predok] => test1
[title] => тест 3

)

[test4] => Array
(
[id] => 5
[predok] => osnova
[title] => тест4
)

[test5] => Array
(
[id] => 6
[predok] => test3
[title] => тест5
)

[test6] => Array
(
[id] => 7
[predok] => test1
[title] => тест6
)

)

А надо привести его к виду:
Array
(
[osnova] => Array
(
[id] => 1
[predok] => 0
[title] => Самый главный
[child] => Array
(
[test1] => Array
(
[id] => 2
[predok] => osnova
[title] => тест1
[child] => Array
(
[test3] => Array
(
[id] => 4
[predok] => test1
[title] => тест 3
[child] => Array
(
[test5] => Array
(
[id] => 6
[predok] => test3
[title] => тест5
)

)

)

[test6] => Array
(
[id] => 7
[predok] => test1
[title] => тест6
)

)

)

[test2] => Array
(
[id] => 3
[predok] => osnova
[title] => тест2
)

[test4] => Array
(
[id] => 5
[predok] => osnova
[title] => тест4
)

)

)


)


Может кто-нить натолкнет меня на мысль, как сделать это попроще?
Я пока что делаю так:
Беру первый (главный) элемент и пробегаюсь по массиву, в поисках "детей".
Потом беру первого ребенка и ищу его детей. И так далее.
Но, пока что не могу сообразить, как правильно брать детей (чтоб не повторялись) и как понять, что я перебрал уже весь массив и дерево готово.
Все это конечно элементарно решается при помощи XML, но данная задача стоит именно с массивами.
Iced:
Хочется верить, что не всё у военных так делается... :)
А вообще, если по делу, то рекурсией сделать это довольно просто, если хорошо представлять себе что это такое. :)
Ещё возникает вопрос: почему родителя Вы адресуете по имени, а не по id? :)

P.S.
И шутка юмора напоследок:
Для того чтобы понять рекурсию, нужно сначала понять рекурсию ;)
Военный:
Я смотрю Вам очень нравится слово рекурсия - видать тока недавно услышали.
Родителя адресую по имени - для наглядности. id в данном случае чисто как счетчик.

А по теме - совет с рекурсивным вызовом дельный. Дальше действительно все довольно просто.
Антон Макаренко:
После того как я начал использовать AS ARRAY_KEY / AS PARENT_KEY в DbSimple2, желание изобретать велосипеды напрочь отбилось. Там не используется рекурсия.
А рекурсивные алгоритмы — пожалуйста: http://forum.dklab.ru/search.html?q=%EC%E0%F1%F1%E8%E2+%E4%E5%F0%E5%E2%EE&sort_by=5&nospam=GEN_BY_JS
Военный:
После того как я начал использовать AS ARRAY_KEY / AS PARENT_KEY в DbSimple2, желание изобретать велосипеды напрочь отбилось. Там не используется рекурсия.


Хм, AS ARRAY_KEY я использовал до этого, а вот AS PARENT_KEY - чото не заметил.
Действительно, для решения моей задачки было достаточно добавить в запрос AS PARENT_KEY.

Эта тема на forum.dklab.ru