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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Древовидный список, список оборудования, данные из MySQL 
:(
    Опции темы
PriZraK
  Дата 31.1.2007, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ломаю голову с самого утра - необходимо создать древовидное меню вида:
Код

[тексты]
+-[текст-1]
| +-[текст-2]
| +-[текст-3]
| +-[текст-4]
| +-[текст-5]
|
+-[текст-6]
| +-[текст-7]
| | +-[текст-8]
| | +-[текст-9]
| |
| +-[текст-10]
| +-[текст-11]
|
+-[текст-12]


Данные берутся из базы данных MySQL, таблица имеет вид:
Код

[id] [id_parent] [num] [text]
1         0      1      текст-1     
2         1      2      текст-2         
3         1      3      текст-3             
4         1      4      текст-4             
5         1      5      текст-5             
6         0      6      текст-6             
7         6      7      текст-7                 
8         7      8      текст-8        
9         7      9      текст-9             
10        6      10     текст-10              
11        6      11     текст-11                  
12        6      12     текст-12              


Отображается это все с помощью JavaScript'a, использую Ajax библиотеку http://script.aculo.us/dist/scriptaculous-js-1.7.0.zip (заказчик требует, чтоб можно было переносить пункты меню) - чем отображать не так важно - важно как написать код... 
Корректно отображается у меня только 1 и 2 ветвь... как сделать чтоб отображалась и третья.. 
Код

| | +-[текст-8]
| | +-[текст-9]

голова дымится просто... 

Пробывал по разному из того что сохранилось:
Вариант А:
Код

     $Qequipment_i = mysql_query("SELECT * FROM equipment WHERE  id_parent=0 ORDER BY `num` ASC") or die("Ответ базы данных: не могу показать информацию о оборудовании сети");
     while ($line_i = mysql_fetch_array($Qequipment_i, MYSQL_ASSOC)) {
         $id=$line_i['id'];
         $tree_i.= "<li class=\"edit_link level0\" id=\"t1_".$line_i['num']."\">".$line_i['ip']."<ul class=\"edit_list\">\n";

         $Qequipment_j = mysql_query("SELECT * FROM equipment WHERE id_parent=$id ORDER BY `num` ASC") or die("Ответ базы данных: не могу показать информацию о оборудовании сети");
         while ($line_j = mysql_fetch_array($Qequipment_j, MYSQL_ASSOC)) {
             if($tree_j<>""){ $tree_j.="</ul></li>\n"; }
             $tree_j.="<li class=\"edit_link level0\" id=\"t1_".$line_j['num']."\">".$line_j['ip']."<ul class=\"edit_list\">\n";
         }

         $tree_i.=$tree_j."</ul></li>\n";
         $tree_j="";
            $tree_i.="</ul></li>\n";
        }



и 
Вариант Б:

Код

         if($tree<>""){
             if($line['id_parent']<>$id_parent){
                 $tree.="<li class=\"edit_link level0\" id=\"t1_".$line['num']."\">".$line['ip']."<ul class=\"edit_list\"></ul></li>\n";
             } else {
                 $tree.="</ul></li>\n";
                 $tree.= "<li class=\"edit_link level0\" id=\"t1_".$line['num']."\">".$line['ip']."<ul class=\"edit_list\">\n";
             }
         } else {
            
             $tree.= "<li class=\"edit_link level0\" id=\"t1_".$line['num']."\">".$line['ip']."<ul class=\"edit_list\">\n";
            }


И тот и тот код - не вооружённым глазом видно что тупы и безумны..
как сделать правельно?
PM MAIL ICQ Skype GTalk   Вверх
mishaSL
Дата 31.1.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я бы делал следующим образом.
1. Делаешь выборку всех записей и записываешь в массив вида $arr[parent_id][id] = значение
2. Делаешь рекурсивную функцию типа:
Код

function tree(& $arr, $pId)
{
    if (is_array($arr[$pId])) {
        print "<ul>";
         foreach($arr[$pId] as $key=>$value) {
            print "<li><a href="".$key."">".$value."</a></li>";
            tree($arr, $key);
        }
        print "</ul>";
    }
}

!!! код не проверял, здесь только суть
Соответственно должно получиться полностью раскрытое дерево. А раскрывать уже смотри как удобнее.

Это сообщение отредактировал(а) mishaSL - 31.1.2007, 17:05


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
PriZraK
Дата 2.2.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Большое спасибо, за примерчик - от него отталкиваясь получился следующий код:
Код

function showtree($parent){
    $Qequipment = mysql_query("SELECT * FROM equipment WHERE id_parent='$parent' ORDER BY `num` ASC") or die("Ответ базы данных: не могу показать информацию о оборудовании сети");
    if (mysql_num_rows($Qequipment) > 0) {
    print "<ul>\n";
        while ($line = mysql_fetch_array($Qequipment, MYSQL_ASSOC)) {
         $id = $line['id'];
            print "<li>".$line['ip']."</li>\n";
            showtree($id);
        }
        print "</ul>\n";
    }
}
showtree(0);

PM MAIL ICQ Skype GTalk   Вверх
mishaSL
Дата 2.2.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В твоем коде есть несколько недостатков:
1. Поле в БД id_parent должно быть числовым, тогда не надо кавычек (' ').
2. Если ты будешь раскрывать сразу все дерево. То чем больше  вложенность будет, тем больше запросов в БД. А это очень плохо.

Добавлено @ 15:44 
Даже при твоей не очень больщой структуре БД. Уже будет 13 запросов. А это очень много.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Dr.Wisdom
Дата 5.2.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А помоему полюбому для одного элемента один запрос.

Можно конечно как нибудь так организовать id_parent что при сортировке записи будут выстраиваться именно в том порядке, в котором они в дереве, потом итерироваться по массиву и по изменению id_parent изменять уровень вложенности.

пример такой организации:

a#
aa#
ab#
aba#
abb#
ac#
ad#
b#
ba#
bb#

тока вместо # надо какойнить символ который будет сортироваться после всех буквенных (не могу вот так просто придумать такой на крайняк - "z").

Тогда размер категории сокращаеться до 32. 
Но и тут можно извращаться дальше и использовать юникод.

Но помоему это извращение.
Если очень надо использовать для вывода дерева один запрос - вперед. Еще и базу надо будет перекроить для этого.

Нееее. Я за рекурсию. Другого столь же простого выхода я не вижу. Если ктонить видит - напишите пожалуйста.

Сколько записей может быть в дереве? Ну я думаю не так много..... А если еще догружать ветвь только ктогда, когда ее развернули.....

Это сообщение отредактировал(а) Dr.Wisdom - 5.2.2007, 15:05
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
mishaSL
Дата 5.2.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я и написал каким образом это лучше оргинизовать (тремя постами выше). Сначало выбрать все в массив. А потом на уровне массива уже рекурсивно строить дерево. При построении деревьев с использованием MySQL и PHP именно так и делал. Это работает в разы быстрее, чем в рекурсивной функции делать запросы к БД. Да и безопаснее для сервера  это будет...


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Dr.Wisdom
Дата 5.2.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



уууупс...... прости, проглядел

$arr[parent_id][id] = значение
Список детей для каждого родителя. Так?
Интересно.
--------------------
VIVA LA RESISTANCE
PM MAIL   Вверх
mishaSL
Дата 5.2.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Dr.Wisdom @  5.2.2007,  15:43 Найти цитируемый пост)
Список детей для каждого родителя. Так?

Просто переносим данные из БД в массив удобного формата.



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Vaulter
Дата 5.2.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



почитай про Nested Sets
как раз про удобную организацию деревьев и как выдрать все дерево одним запросом


--------------------
PM MAIL WWW ICQ   Вверх
mishaSL
Дата 5.2.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Vaulter @  5.2.2007,  19:33 Найти цитируемый пост)
почитай про Nested Sets


Вешь не плохая, но для простых задач очень объемная.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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