Автор Тема: Дерево разделов  (Прочитано 4515 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DartSidius

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 309
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Дерево разделов
« : 15 Января 2008, 04:47:11 »
В общем нужно сделать дерево разделов...структура в БД примерно такая:
id   name   parent
1    AAA    0
2    BBB     1
3    CCC     0


и т.д. . . . у меня получилось сделать с использованием рекурсивной функции . . . есть варианты реализации без рекурсии?

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Дерево разделов
« Ответ #1 : 15 Января 2008, 16:29:26 »
DartSidius
ограничить уровень вложения, вменяемым числом....
And no religion too...

Оффлайн DartSidius

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 309
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Дерево разделов
« Ответ #2 : 15 Января 2008, 16:34:28 »
Не...это понятно...у меня и при использовании рекурсивной функции ограничивается . . . я не могу реализовать чтобы в одной чтобы без рекурсии работало . . . т.е. вызвал &tree например и дерево построилось

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Дерево разделов
« Ответ #3 : 15 Января 2008, 17:42:50 »
DartSidius
тогда не очень понямаю...
что значит "вызвал &tree например"

проблемма сделать метод или как?
And no religion too...

Оффлайн DartSidius

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 309
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Дерево разделов
« Ответ #4 : 16 Января 2008, 01:30:26 »
Объясняю :)  . . .

Сейчас у меня дерево работает так...
1) Из скрипта вызывается функция . . .&tree
2) В скрипте эта ж функция вызывает сама себя . . . т.е. она рекурсивная . .  .

Вот и хочется написать чтобы &tree не вызывала сама себя! . . . т.е. построить дерево без рекурсии

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Дерево разделов
« Ответ #5 : 16 Января 2008, 09:06:14 »
DartSidius
делай циклама... хотя суть останется одна и таже... вот только смысла в этом я не вижу...
And no religion too...

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Дерево разделов
« Ответ #6 : 16 Января 2008, 23:52:28 »
если для запроса cделать ORDER BY parent, name

То одним циклом можно создать дерево. без рекурсии

Я бы посоветывал создать два класса

1. управляющий класс
2. класс экземпляра

начну с описания класса экземпляра

класс экземпляра{
     #атрибуты
     -имяЭлемента;
     -ИдЭлемента;
     -РодительскийИдЭлемента;
     -ссылкаНаУправляющийЭлемент;# будет он глобальной переменной или еще как,
# но этот атрибут нужно обязательно сделать возможно при создании экземпляра
     -ХешДетей;# здесь хранятся ссылки по которым можно получить объект из управляющего элемента
=======================
     #методы
     ->создать_экз();
     ->добавить_ребенка();
     ->получить_атрибут;
     ->получить_массив_Детей();# возвращает массив объектов по ссылкам
     ->получить_массив_Детей(атрибут);# массив определенного свойства всех детей

}



*управляющий класс*{
    #атрибуты
    -ХешЭлементов // хеш в котором со
=======================
    #методы
    ->инициализация();
    ->обработка_набора_данных_из_бд(); #здесь прям в одном цикле добавлять,
# создавать объекты класса экзмпляр и сохранять в -ХешЭлементов
    ->получить_элемент(); #возвращает объект.
}


смысл всего выше описанного в следующем
Создать дерево
1. создать управляющий элемент
2. вызвать ->обработку_набора_данных_из_бд();
Все данные готовы для работы дальнейшей.

какая может быть дальнейшая работа?
1.получить какойто элемент дерева
2. получить список детей элемента дерева.
3.получить доступ к детям любого элемента дерева

4. мне кажется самое интересное - последнее построеение хтмл дерева к примеру, для одного элемента.
для этого в класс экземпляра нужно добавить функцию которая будет наподобе рекурсии работать. но все же это не рекурсия. пожалуй ее описание стоит привести

->получить_хтмл(){
$rs = $this->получить_массив_Детей();
if(!$rs)return $this->html;#либо еще одна функция которая генерит хтмл
foreach($rs as $child){
$html.= $child->получить_хтмл();
}
return $html;
}

вобще наверно это тоже можно сказать рекурсия.

Вобще это очень масштабируемый подход. при небольшой фантазии по принцепу метода построения хтмл можно в экземпляр добавлять функции обхода ветки дерева

и очень просты в реализации также методы
метод удаление_ребенка
метод перемещения_ветки начиная с эл

хотя есть еще недостаток. так как в управляющем элементе хранятся все объекты. а в экземплярах только ссылки. то возможен вариант пересечения веток, на этот случай можно при добавлении ребенка проверять родительскийИдЭлемента вот так гдето думаю можно сделать, а вы как думаете?
« Последнее редактирование: 17 Января 2008, 00:04:22 от ravshaniy »
убили кенни, сволочи

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28