![]() |
Построение многоуровеневого меню на php
Задача такова. Для простоты, есть некий массив, например такой:
PHP код:
Нужно на php сделать вывод этого массива в древовидном виде, для данного примера в таком: Код:
o Да и сам код по моему не слишком удачен (увеличение массива до двухмерного сдается мне не очень удачное решение) Вот что пока получается: PHP код:
Зы. недавно где-то видел тему с похожим названием, но чё-т не смог найти... |
Использовать счетчик уровня. Вот как я себе это представляю:
PHP код:
|
Если небольшой массив, то, наверное можно делать так:
1. Выбрать корневой элемент (один) 2. Найти все элементы, значение которых равно ключу корневого элемента 3. Для каждого из тех элементов найти также их "детей" Получается тоже рекурсия, просто в процедуру еще передавать номер шага и соответственно на экран выводить столько "_" каков сейчас шаг, плюс при нахождении какого-то элемента его нужно каким-то образом "удалить", чтобы по нескольку раз его не читать... |
The_naked
Речь про какое-то универсальное решение ;) По началу я решил просто сделать ограничение в три подуровня и вложенные циклы создал, но есть желание без ограничений таких решить проблему. Trotil В принципе работает, да. Я как-то до такого не додумал. Но есть ли другие методы решения подобного? Или такой постановке задачи другого решения нету? Тогда может как-то по другому можно сделать задание менюшек? Сейчас пришла в голову мысль о многуровневом массиве, каждый уровень которого отвечал бы за соответствующий уровень на сайте. Вроде бы тут всё просто, но тогда другая проблема. Как его хранить в mysql? (Суть идеи такова, в базе должна быть таблица, в которой хранится менюшка...) |
Цитата:
Вот, почитайте. Сам не вникал особенно подробно, соответственно не сравнивал с другими алгоритмами но для разбирательства с этой темой может быть очень полезно. И если не требуется работы с суперсложными деревьями, где очень принципиальны параметры, может быть очень неплохой идеей использование напрямую данного класса, без разбирательств в теории. |
Цитата:
Получаю параметры с активным элементом и ищу родительские элементы пока они есть. |
EvroStandart
Можешь показать пример кода? Не совсем представляю себе, как это реализовать без двухмерного массива... Точнее пока совсем не представляю :( |
Держи функцию, которую я когда-то писал для этих целей:
$link - соед. с базой $sqlTblCat - таблица, хранящая меню my_mysql_query() - я ей ошибки обрабатывал $href передаётся для формирования ссылки в меню Хотя это всё не важно, думаю можно и так разобраться:) PHP код:
PHP код:
Код:
CREATE TABLE `cathegories` ( |
Занятно.
Попарился сегодня ещё над развитием своего варианта, и таки получилось то что и хотел. PHP код:
Но если влоб сделать такую замену - скрипт перестает работать как надо. При обходе foreach($m as $key=>$value) при определенном условии вызывается эта же функция (рекурсия вроде называется), в которой так же идет обход foreach($m as $key=>$value). Так вот, выход из рекурсивно вызванной функции происходит при невыполнении условия if и завершении foreach. И после этого выхода из функции счетчик foreach не восстанавливает своего значения, а указывает туда, где остановился в выполненной только что функции, т.е. в конец. А это не есть гуд. Я решил просто добавлением после global $m определения $j=$m и в foreach использую уже $j. Тогда при возвращении из функции указатель указывает на тот элемет массива, на котором остановился перед её вызовом. Не понятным мне остается, почему такая разница получается при использовании $m[0] и $m. |
Цитата:
Для себя выдернул алгоритм построения меню(смотри фун-ию Ajar). Но алгоритм не оптимальный. Все остальное вроде уже где-то встречалось... p.s. К тому же, если у вас есть в наличии нормальная СУБД(pgsql/ms sql/etc), то необходимо, просто обязательно использовать хранимки, триггеры и транзакции — решите кучу проблем, а также добавите скорости. |
Тоже самое, но немного другими словами:
Деревья Nested Sets Управление деревьями Nested Set Дерево каталогов NESTED SETS (вложенные множества) часть вторая |
Часовой пояс GMT +4, время: 16:10. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.