imho.ws |
|
30.09.2005, 18:15 | # 1 |
::VIP::
Регистрация: 19.10.2003
Адрес: Питер
Пол: Male
Сообщения: 1 467
|
Построение многоуровеневого меню на php
Задача такова. Для простоты, есть некий массив, например такой:
PHP код:
Нужно на php сделать вывод этого массива в древовидном виде, для данного примера в таком: Код:
o _q __s _r _y p t _g _f _j __z ___e __h Да и сам код по моему не слишком удачен (увеличение массива до двухмерного сдается мне не очень удачное решение) Вот что пока получается: PHP код:
Зы. недавно где-то видел тему с похожим названием, но чё-т не смог найти... Последний раз редактировалось SergoZD; 30.09.2005 в 18:19. |
30.09.2005, 19:06 | # 2 |
Advanced Member
Регистрация: 21.04.2005
Адрес: град Москва
Сообщения: 431
|
Использовать счетчик уровня. Вот как я себе это представляю:
PHP код:
|
30.09.2005, 19:10 | # 3 |
::VIP::
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194
|
Если небольшой массив, то, наверное можно делать так:
1. Выбрать корневой элемент (один) 2. Найти все элементы, значение которых равно ключу корневого элемента 3. Для каждого из тех элементов найти также их "детей" Получается тоже рекурсия, просто в процедуру еще передавать номер шага и соответственно на экран выводить столько "_" каков сейчас шаг, плюс при нахождении какого-то элемента его нужно каким-то образом "удалить", чтобы по нескольку раз его не читать...
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным. |
30.09.2005, 20:04 | # 4 |
::VIP::
Регистрация: 19.10.2003
Адрес: Питер
Пол: Male
Сообщения: 1 467
|
The_naked
Речь про какое-то универсальное решение По началу я решил просто сделать ограничение в три подуровня и вложенные циклы создал, но есть желание без ограничений таких решить проблему. Trotil В принципе работает, да. Я как-то до такого не додумал. Но есть ли другие методы решения подобного? Или такой постановке задачи другого решения нету? Тогда может как-то по другому можно сделать задание менюшек? Сейчас пришла в голову мысль о многуровневом массиве, каждый уровень которого отвечал бы за соответствующий уровень на сайте. Вроде бы тут всё просто, но тогда другая проблема. Как его хранить в mysql? (Суть идеи такова, в базе должна быть таблица, в которой хранится менюшка...) |
30.09.2005, 21:14 | # 5 | |
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
|
Цитата:
Вот, почитайте. Сам не вникал особенно подробно, соответственно не сравнивал с другими алгоритмами но для разбирательства с этой темой может быть очень полезно. И если не требуется работы с суперсложными деревьями, где очень принципиальны параметры, может быть очень неплохой идеей использование напрямую данного класса, без разбирательств в теории.
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
04.10.2005, 20:16 | # 8 |
Junior Member
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162
|
Держи функцию, которую я когда-то писал для этих целей:
$link - соед. с базой $sqlTblCat - таблица, хранящая меню my_mysql_query() - я ей ошибки обрабатывал $href передаётся для формирования ссылки в меню Хотя это всё не важно, думаю можно и так разобраться PHP код:
PHP код:
Код:
CREATE TABLE `cathegories` ( `id` int(11) NOT NULL auto_increment, `pid` int(11) NOT NULL default '0', `descName` varchar(255) NOT NULL default '' )
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981. Все "спасибо" в репутацию Последний раз редактировалось Al-x; 04.10.2005 в 20:18. |
13.10.2005, 21:01 | # 9 |
::VIP::
Регистрация: 19.10.2003
Адрес: Питер
Пол: Male
Сообщения: 1 467
|
Занятно.
Попарился сегодня ещё над развитием своего варианта, и таки получилось то что и хотел. PHP код:
Но если влоб сделать такую замену - скрипт перестает работать как надо. При обходе foreach($m as $key=>$value) при определенном условии вызывается эта же функция (рекурсия вроде называется), в которой так же идет обход foreach($m as $key=>$value). Так вот, выход из рекурсивно вызванной функции происходит при невыполнении условия if и завершении foreach. И после этого выхода из функции счетчик foreach не восстанавливает своего значения, а указывает туда, где остановился в выполненной только что функции, т.е. в конец. А это не есть гуд. Я решил просто добавлением после global $m определения $j=$m и в foreach использую уже $j. Тогда при возвращении из функции указатель указывает на тот элемет массива, на котором остановился перед её вызовом. Не понятным мне остается, почему такая разница получается при использовании $m[0] и $m. Последний раз редактировалось SergoZD; 13.10.2005 в 21:07. |
13.10.2005, 23:06 | # 10 | |
Full Member
Регистрация: 29.05.2002
Сообщения: 544
|
Цитата:
Для себя выдернул алгоритм построения меню(смотри фун-ию Ajar). Но алгоритм не оптимальный. Все остальное вроде уже где-то встречалось... p.s. К тому же, если у вас есть в наличии нормальная СУБД(pgsql/ms sql/etc), то необходимо, просто обязательно использовать хранимки, триггеры и транзакции — решите кучу проблем, а также добавите скорости.
__________________
убрано по просьбе администратора Последний раз редактировалось Sheryld; 13.10.2005 в 23:14. |
|
24.10.2005, 09:35 | # 11 |
Junior Member
Регистрация: 17.08.2003
Адрес: Украина
Сообщения: 150
|
Тоже самое, но немного другими словами:
Деревья Nested Sets Управление деревьями Nested Set Дерево каталогов NESTED SETS (вложенные множества) часть вторая
__________________
His name is spelled A-P-O-C, with a C - not APOK, because it originates from the word 'apocalypse'... |