| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > Массив, содержащий данные о дереве |
| Автор: Drkwv 30.7.2007, 16:31 |
| Вопрос такой - вы работает в PHP и есть некая функция, которая выводит из БД иерархическое меню и результат ее работы - массив. Какой, по вашему мнению, должна быть структура этого массива, чтобы работа по выводу/сортировке/дальнейшей обработки полученного дерева была максимально удобна? Навскидку приходит два варианта - вложенные массивы типа array(array('Пункт 1','Пункт 2'),'Пункт 3') или же список массивов array('name'=>...,'level'=>) и т.п. Вопрос в том какая структура массива была бы оптимальна именно для того чтобы при помощи PHP можно было вертеть этим меню "как захочется"? Чего обычно не хватает при работе с подобными вещами? Спасибо. |
| Автор: Li...Man 30.7.2007, 18:43 |
| array('name'=>...,'level'=> будет понятнее и проще выводить но намного сложнее управлять.... Кроме того при сортировке array(array('Пункт 1','Пункт 2'),'Пункт 3') будет вообще головной болью Зато если захочешь перемесить узел вместе с его подузлами то array('name'=>...,'level'=> тут станет головной болью Вобщем тебе решать... Я лично выбрал нечто похожее на array('name'=>...,'level'=> только посложнее |
| Автор: Diesel Draft 31.7.2007, 10:01 |
| [menu1] => { [submenu1] => 'link1'; [submenu2] => 'link2'; [submenu1] => { [subsubmenu1] => 'dfdsfdfd' }; } [menu2] => 'link3' |
| Автор: Drkwv 31.7.2007, 13:31 | ||
Спасибо за интересную идею. В принципе, такое возможно сделать, но [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')) |
| Автор: Diesel Draft 31.7.2007, 13:36 |
| Иногда "велосипед" намного лучше. Это не сложно написать. Главное правильно поставить задачу |
| Автор: Drkwv 31.7.2007, 13:49 | ||
Дык в том и дело, что выводится дерево из базы одной функцией, а что там с ним делать надо будет - неизвестно и каждый раз по-разному. Хочется сократить время написания велосипедов, предоставив изначально удобную структуру. |
| Автор: Diesel Draft 31.7.2007, 13:53 |
| Drkwv, дело твое. В этом сложно переубедить человека |
| Автор: Oflashp 2.8.2007, 17:42 |
| По теме: Зависит от задачи, которая поставлена. Нарисовать древовидное меню - одно. Нарисовать таблицу с деревом, при этом учесть, что в одной строке надо просто заголовок, в следущей надо заголовок, имя и пароль в четвертом опять ответвления с данными...задачка явно не для глупых людей. Можно ещё запихнуть и экономию данных, вообще станет интересно жить Оффтоп: Я вот сейчас сам работаю над таким деревом, точнее конкструктором, которому передаёшь параметры и запрос к базе и он рисует дерево. Сложность пока увидел только в одном - мой мозги не запоминают столько ID индификаторов к таблице HTML. Хочется всё без отрывно печатать, не получается. На обдумывание и тесты ушло около 5-6 часов рабочих. И это ещё видимо не конец. |
| Автор: dorber 23.8.2007, 10:37 |
| Есть еще один удобный вариант для хранения деревьев: $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 совместно с вышеописанной. |