
Создание древовидного списка из массива
Еще одна из часто встречающихся задач при разработке сайтов - создание многоуровневых древовидных списков. Отдельные элементы списков хранятся в массиве и объединяются между собой через связку полей "ID элемента" - "Родительский элемент". Это могут быть выпадающие меню с несколькими уровнями субменю, каталоги товаров по категориям, карты сайта и т.п. Попробуем описать трехуровневое вложенное меню. Для этого зададим массив вручную, а в реальной ситуации он может быть, например, получен из базы. Количество уровней вложенности может быть произвольным, три уровня выбраны исключительно для примера.Code (PHP) : Убрать нумерацию
- // Построение из массива древовидного списка без использования рекурсии
- $menu=array(
- 1=>array('name'=>'Овощи', 'parent'=>0),
- 6=>array('name'=>'Капуста', 'parent'=>1),
- 7=>array('name'=>'Помидоры', 'parent'=>1),
- 9=>array('name'=>'Салат', 'parent'=>1),
- 18=>array('name'=>'Китайский салат', 'parent'=>9),
- 12=>array('name'=>'Тыква', 'parent'=>1),
- 16=>array('name'=>'Редиска', 'parent'=>1),
- 2=>array('name'=>'Фрукты', 'parent'=>0),
- 13=>array('name'=>'Бананы', 'parent'=>2),
- 14=>array('name'=>'Ягоды', 'parent'=>2),
- 19=>array('name'=>'Арбуз', 'parent'=>14),
- 20=>array('name'=>'Клубника', 'parent'=>14),
- 3=>array('name'=>'Животные', 'parent'=>0),
- 4=>array('name'=>'Растения', 'parent'=>0),
- 8=>array('name'=>'Конопля', 'parent'=>4),
- 11=>array('name'=>'Мак', 'parent'=>4),
- 17=>array('name'=>'Сахарный тростник', 'parent'=>4),
- 5=>array('name'=>'Насекомые', 'parent'=>0),
- 10=>array('name'=>'Тараканы', 'parent'=>5),
- );
Code (PHP) : Убрать нумерацию
- // Построение дерева за один проход
- foreach($menu as $menu_id=>$data) {
- // Прописать в родительском узле ссылку на пункт меню
- $menu[$data['parent']]['child'][$menu_id]=&$menu[$menu_id];
- }
- // Готовый массив находится в $menu[0]['child']
- $sorted_menu=(array)$menu[0]['child'];
Массив преобразован в древовидную структуру, теперь его можно вывести на экран или вставить в шаблон сайта.
Code (PHP) : Убрать нумерацию
- echo '<ul>';
- foreach($sorted_menu as $top_menu) {
- // Меню верхнего уровня
- echo '<li>'.$top_menu['name'];
- if (count($top_menu['child'])) {
- // Субменю второго уровня
- echo '<ul>';
- foreach($top_menu['child'] as $sub_menu) {
- echo '<li>'.$sub_menu['name'];
- if (count($sub_menu['child'])) {
- // Субменю третьего уровня
- echo '<ul>';
- foreach($sub_menu['child'] as $subsub_menu) {
- echo '<li>'.$subsub_menu['name'].'</li>';
- }
- echo '</ul>';
- }
- echo '</li>';
- }
- echo '</ul>';
- }
- echo '</li>';
- }
- echo '</ul>';
Просмотров: 11519 | Комментариев: 11
Метки: PHP

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
THomZone
(29.09.2015 в 09:25):
Спасибо огромное

fif
(17.04.2015 в 10:39):
Помогите приспособить это решение для вывода списка категорий с дочками с постраничной навигацией.

ManHunter
(07.04.2015 в 11:37):
Ахуеть! В детском садике выходной что ли? Скрипткиддисов отпустили домой мамкину сиську пососать? Иди нахуй, уебок.

sas
(07.04.2015 в 10:14):
<img src='javascript:alert()'>

Иван
(03.07.2013 в 11:46):
Спасибо за простоту решения.

[p0-[
(15.03.2013 в 23:54):
[-[[

Droid
(26.08.2011 в 02:10):
Можете показать версию где массив данных берётся из БД ?

Александр
(09.08.2011 в 14:05):
Мне лично больше нравиться рекурсия ) Просто и компактно. Да и редактировать проще ее. Скажем, если будет необходимо прописать не просто тег <li>, а <li class="my_li">, то надо будет три раза исправлять вместо одного ) Либо пользоваться Ctrl+F )

eGo
(07.08.2011 в 07:40):
А я уже тут размечтался, думал появился тот самый гуру что придумал функцию для нерекурсивного вывода массива со структурой adjacency list

Megabyte
(21.05.2011 в 00:13):
Огромное человеческое спасибо!

prohozhiy
(03.05.2011 в 11:24):
4=>array('name'=>'Растения', 'parent'=>0),
8=>array('name'=>'Конопля', 'parent'=>4),
11=>array('name'=>'Мак', 'parent'=>4)
Растения похоже не совсем случайно выбирались :-)
8=>array('name'=>'Конопля', 'parent'=>4),
11=>array('name'=>'Мак', 'parent'=>4)
Растения похоже не совсем случайно выбирались :-)

Добавить комментарий
Заполните форму для добавления комментария
