Forum Webscript.Ru
Программирование => Perl => Тема начата: DartSidius от 15 Января 2008, 04:47:11
-
В общем нужно сделать дерево разделов...структура в БД примерно такая:
id name parent
1 AAA 0
2 BBB 1
3 CCC 0
и т.д. . . . у меня получилось сделать с использованием рекурсивной функции . . . есть варианты реализации без рекурсии?
-
DartSidius
ограничить уровень вложения, вменяемым числом....
-
Не...это понятно...у меня и при использовании рекурсивной функции ограничивается . . . я не могу реализовать чтобы в одной чтобы без рекурсии работало . . . т.е. вызвал &tree например и дерево построилось
-
DartSidius
тогда не очень понямаю...
что значит "вызвал &tree например"
проблемма сделать метод или как?
-
Объясняю :) . . .
Сейчас у меня дерево работает так...
1) Из скрипта вызывается функция . . .&tree
2) В скрипте эта ж функция вызывает сама себя . . . т.е. она рекурсивная . . .
Вот и хочется написать чтобы &tree не вызывала сама себя! . . . т.е. построить дерево без рекурсии
-
DartSidius
делай циклама... хотя суть останется одна и таже... вот только смысла в этом я не вижу...
-
если для запроса 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;
}
вобще наверно это тоже можно сказать рекурсия.
Вобще это очень масштабируемый подход. при небольшой фантазии по принцепу метода построения хтмл можно в экземпляр добавлять функции обхода ветки дерева
и очень просты в реализации также методы
метод удаление_ребенка
метод перемещения_ветки начиная с эл
хотя есть еще недостаток. так как в управляющем элементе хранятся все объекты. а в экземплярах только ссылки. то возможен вариант пересечения веток, на этот случай можно при добавлении ребенка проверять родительскийИдЭлемента вот так гдето думаю можно сделать, а вы как думаете?