» Форма входа

»Мoy-weB ver.4.1

» Статистика

Главная » 2008 » Сентябрь » 20 » Вывод дерева в MySQL

Вывод дерева в MySQL
20.Сен.2008 | 19:54:45

Вывод дерева в MySQL


Данная тема уже заезжена до протертых шин, но все таки какой
программист с этим не сталкивался. Я лишь покажу один пример,
основанный на базе, рекурсия с выполнением каждого раза запроса может
оказаться ненароком очень долгой, поэтому сначала забросим все данные
одним запросом в массив, а рекурсией будем пробегаться по нему.

Понеслася.


Определимся с чем будем иметь дело. Примерная табла будет содержать как минимум 3 столбца.


CREATE TABLE Tree (
`
ID` INT NOT NULL AUTO_INCREMENT,
`
ParentID` INT NOT NULL,
`
Title` VARCHAR(255) NOT NULL,
PRIMARY KEY(`ID`)
)



Ну и что нам теперь делать? Осталось
написать скрипт который бы обработал эту таблицу и вывел дерево на
экран. Как и было сказано, для начала надо выполнить запрос на всю базу.


SELECT ID, ParentID, Title FROM Tree;


Результат собираем следующим образом. Если вы представляете себе двухмерный массив то без труда поймете следующий код.


while($row = mysql_fetch_assoc($res)){
$tree[$row['ParentID']][$row['ID']] = $row['Title'];
}



Чтобы посмотреть что же лежит в массиве
можно просто выполнить print_r($tree) и будет вам счастье! Для чего я
заделал $row['ID'] на второй уровень? Для связи с ParentID, действуем
таже как если бы мы просто выполняли запросы в рекурсии, но мы же
орудуем массивами...


function ShowTree($tree, $pid=0){
echo
"<ul type='square'>";
foreach(
$tree as $id=>$root){
if(
$pid!=$id)continue;
if(
count($root)){
foreach(
$root as $key => $title){
echo
"<li>{$title}";
if(
count($tree[$key]))ShowTree($tree,$key);
}
}
}
echo
"</ul>";
}




Step By Step


Я
пробегаюсь по всему Parent дереву. Если помните то в $root будет
содержаться массив с содержимым всех полей с этим ParentID. Чтобы не
повторится с выводом полей сделаем затычку $pid!=$id для следующего
вызова рекурсии. Осталось лишь пробежаться по содержимому, для чего
запускаем второй foreach. Немного отступлюсь. чтобы не было
недоразумений, типа а чего скрипт ругается на foreach, прямо перед ним
делаю проверку на количество содержимого массива. Естественно, foreach
обрабатывает массив и к тому же не "нулевый"!

Возвращаемся.


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


if(count($tree[$key]))ShowTree($tree,$key);


В принципе вот и все. Согласитесь что
несложно, а времени скрипта экономится , дай БожЕ. И применений куча.
Так что считай что если ты прочитал и вник первый раз, то жму руки а
сам сваливаю до дому.
Категория: Статьй и уроки | Просмотров: 467 | Добавил: CorsaR
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]