Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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'=> тут станет головной болью smile.

Вобщем тебе решать... Я лично выбрал нечто похожее на 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
Цитата(Diesel Draft @ 31.7.2007,  10:01)
[menu1] => {
                      [submenu1] => 'link1';
                      [submenu2] => 'link2';
                      [submenu1] => {
                                                  [subsubmenu1] => 'dfdsfdfd'
                                                };
                    }
[menu2] => 'link3'

Спасибо за интересную идею. В принципе, такое возможно сделать, но [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:36)
Иногда "велосипед" намного лучше. Это не сложно написать. Главное правильно поставить задачу

Дык в том и дело, что выводится дерево из базы одной функцией, а что там с ним делать надо будет - неизвестно и каждый раз по-разному. Хочется сократить время написания велосипедов, предоставив изначально удобную структуру.

Автор: Diesel Draft 31.7.2007, 13:53
Drkwv, дело твое. В этом сложно переубедить человека  smile 

Автор: Oflashp 2.8.2007, 17:42
По теме: Зависит от задачи, которая поставлена. Нарисовать древовидное меню - одно. Нарисовать таблицу с деревом, при этом учесть, что в одной строке надо просто заголовок, в следущей надо заголовок, имя и пароль в четвертом опять ответвления с данными...задачка явно не для глупых людей. Можно ещё запихнуть и экономию данных, вообще станет интересно житьsmile
Оффтоп: Я вот сейчас сам работаю над таким деревом, точнее конкструктором, которому передаёшь параметры и запрос к базе и он рисует дерево. Сложность пока увидел только в одном - мой мозги не запоминают столько ID индификаторов к таблице HTML. Хочется всё без отрывно печатать, не получается.  smile Приходится подсматривать в некий template.
На обдумывание и тесты ушло около 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 совместно с вышеописанной.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)