![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Drkwv |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Вопрос такой - вы работает в PHP и есть некая функция, которая выводит из БД иерархическое меню и результат ее работы - массив.
Какой, по вашему мнению, должна быть структура этого массива, чтобы работа по выводу/сортировке/дальнейшей обработки полученного дерева была максимально удобна? Навскидку приходит два варианта - вложенные массивы типа array(array('Пункт 1','Пункт 2'),'Пункт 3') или же список массивов array('name'=>...,'level'=>) и т.п. Вопрос в том какая структура массива была бы оптимальна именно для того чтобы при помощи PHP можно было вертеть этим меню "как захочется"? Чего обычно не хватает при работе с подобными вещами? Спасибо. |
|||
|
||||
Li...Man |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.3.2005 Репутация: нет Всего: нет |
array('name'=>...,'level'=> будет понятнее и проще выводить но намного сложнее управлять....
Кроме того при сортировке array(array('Пункт 1','Пункт 2'),'Пункт 3') будет вообще головной болью Зато если захочешь перемесить узел вместе с его подузлами то array('name'=>...,'level'=> тут станет головной болью ![]() Вобщем тебе решать... Я лично выбрал нечто похожее на array('name'=>...,'level'=> только посложнее |
|||
|
||||
Diesel Draft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
[menu1] => {
[submenu1] => 'link1'; [submenu2] => 'link2'; [submenu1] => { [subsubmenu1] => 'dfdsfdfd' }; } [menu2] => 'link3' |
|||
|
||||
Drkwv |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Спасибо за интересную идею. В принципе, такое возможно сделать, но [submenu1] => array() должен следовать сразу за [submenu1] => 'link', чтобы его можно было обойти при помощи array_walk_recursive не заморачиваясь написанием своей функции обхода. Вообще смысл вопроса в том, какой должна быть структура массива, чтобы его было к нему удобно было применять встроенные функции PHP, не занимаясь написанием велосипедов. (т.к, для array_multisort, например, подойдет структура таблицы в виде array('col1'=>array(1,2,3),'col2'=>array('a','b','c')) чем такая же таблица в виде array(array('col1'=>1,'col2'=>'a'),array('col1'=>2,'col2'=>'b'),array('col1'=>3,'col2'=>'c')) Это сообщение отредактировал(а) Drkwv - 31.7.2007, 13:36 |
|||
|
||||
Diesel Draft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Иногда "велосипед" намного лучше. Это не сложно написать. Главное правильно поставить задачу
|
|||
|
||||
Drkwv |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 21.3.2006 Репутация: нет Всего: нет |
Дык в том и дело, что выводится дерево из базы одной функцией, а что там с ним делать надо будет - неизвестно и каждый раз по-разному. Хочется сократить время написания велосипедов, предоставив изначально удобную структуру. |
|||
|
||||
Diesel Draft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 876 Регистрация: 18.1.2005 Где: Lviv, Ukraine Репутация: нет Всего: 5 |
Drkwv, дело твое. В этом сложно переубедить человека
![]() |
|||
|
||||
Oflashp |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 2.8.2007 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: 2 |
По теме: Зависит от задачи, которая поставлена. Нарисовать древовидное меню - одно. Нарисовать таблицу с деревом, при этом учесть, что в одной строке надо просто заголовок, в следущей надо заголовок, имя и пароль в четвертом опять ответвления с данными...задачка явно не для глупых людей. Можно ещё запихнуть и экономию данных, вообще станет интересно жить
![]() Оффтоп: Я вот сейчас сам работаю над таким деревом, точнее конкструктором, которому передаёшь параметры и запрос к базе и он рисует дерево. Сложность пока увидел только в одном - мой мозги не запоминают столько ID индификаторов к таблице HTML. Хочется всё без отрывно печатать, не получается. ![]() На обдумывание и тесты ушло около 5-6 часов рабочих. И это ещё видимо не конец. |
|||
|
||||
dorber |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 3 Регистрация: 10.7.2007 Репутация: нет Всего: нет |
Есть еще один удобный вариант для хранения деревьев:
$array[parent_id][id] = $link; Получается что $array[0] - элементы верхнего уровня, а остальные обходятся с помощью рекурсии, например. Один из плюсов в том что этот массив можно подготовить без особых затрат: $sql = "SELECT * FROM table"; $res = mysql_query($sql); while ($line = mysql_fetch_assoc($res)) { $array[$line["parent_id"]][$line["id"]] = $line; } В свое время применял этот метод для написания древовидных форумов (помните такие?). Там правда было сложней, потому что добавлялись дополнительные условия. P.S.: Чтобы память не засорять, лучше органичивать кол-во полей при выборке. А потом подгружать по мере необходимости. Т.е. нет смысла для всех записей грузить поле "контент", чтобы построить меню. P.P.S.: Кстати возможны вариации метода с массивом $array. Совсем недавно использовал конструкцию $array[url][parent_id] = id совместно с вышеописанной. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |