Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив, содержащий данные о дереве, оптимальный способ вывода 
:(
    Опции темы
Drkwv
Дата 30.7.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



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

Какой, по вашему мнению, должна быть структура этого массива, чтобы работа по выводу/сортировке/дальнейшей обработки полученного дерева была максимально удобна?

Навскидку приходит два варианта - вложенные массивы типа array(array('Пункт 1','Пункт 2'),'Пункт 3') или же список массивов array('name'=>...,'level'=>) и т.п.

Вопрос в том какая структура массива была бы оптимальна именно для того чтобы при помощи PHP можно было вертеть этим меню "как захочется"? Чего обычно не хватает при работе с подобными вещами? Спасибо.
PM MAIL   Вверх
Li...Man
Дата 30.7.2007, 18:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 28.3.2005

Репутация: нет
Всего: нет



array('name'=>...,'level'=> будет понятнее и проще выводить но намного сложнее управлять.... 

Кроме того при сортировке array(array('Пункт 1','Пункт 2'),'Пункт 3') будет вообще головной болью

Зато если захочешь перемесить узел вместе с его подузлами то array('name'=>...,'level'=> тут станет головной болью smile.

Вобщем тебе решать... Я лично выбрал нечто похожее на array('name'=>...,'level'=> только посложнее
PM MAIL   Вверх
Diesel Draft
Дата 31.7.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



[menu1] => {
                      [submenu1] => 'link1';
                      [submenu2] => 'link2';
                      [submenu1] => {
                                                  [subsubmenu1] => 'dfdsfdfd'
                                                };
                    }
[menu2] => 'link3'


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Drkwv
Дата 31.7.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Цитата(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'))

Это сообщение отредактировал(а) Drkwv - 31.7.2007, 13:36
PM MAIL   Вверх
Diesel Draft
Дата 31.7.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



Иногда "велосипед" намного лучше. Это не сложно написать. Главное правильно поставить задачу


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Drkwv
Дата 31.7.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Цитата(Diesel Draft @ 31.7.2007,  13:36)
Иногда "велосипед" намного лучше. Это не сложно написать. Главное правильно поставить задачу

Дык в том и дело, что выводится дерево из базы одной функцией, а что там с ним делать надо будет - неизвестно и каждый раз по-разному. Хочется сократить время написания велосипедов, предоставив изначально удобную структуру.
PM MAIL   Вверх
Diesel Draft
Дата 31.7.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 876
Регистрация: 18.1.2005
Где: Lviv, Ukraine

Репутация: нет
Всего: 5



Drkwv, дело твое. В этом сложно переубедить человека  smile 


--------------------
НЕДОМА в маси 
PM MAIL WWW ICQ GTalk   Вверх
Oflashp
  Дата 2.8.2007, 17:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 2.8.2007
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: 2



По теме: Зависит от задачи, которая поставлена. Нарисовать древовидное меню - одно. Нарисовать таблицу с деревом, при этом учесть, что в одной строке надо просто заголовок, в следущей надо заголовок, имя и пароль в четвертом опять ответвления с данными...задачка явно не для глупых людей. Можно ещё запихнуть и экономию данных, вообще станет интересно житьsmile
Оффтоп: Я вот сейчас сам работаю над таким деревом, точнее конкструктором, которому передаёшь параметры и запрос к базе и он рисует дерево. Сложность пока увидел только в одном - мой мозги не запоминают столько ID индификаторов к таблице HTML. Хочется всё без отрывно печатать, не получается.  smile Приходится подсматривать в некий template.
На обдумывание и тесты ушло около 5-6 часов рабочих. И это ещё видимо не конец.

PM MAIL ICQ   Вверх
dorber
Дата 23.8.2007, 10:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: 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 совместно с вышеописанной.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1314 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.