ГлавнаяРегистрацияВход Приветствую Вас Гость | RSS
Четверг, 08.01.2009, 23:42

Рекомендуем загрузить

 
 
Главная » Статьи » Базы данных

Вывод дерева в 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);

В принципе вот и все. Согласитесь что несложно, а времени скрипта экономится , дай БожЕ. И применений куча. Так что считай что если ты прочитал и вник первый раз, то жму руки а сам сваливаю до дому.


Источник: http://realcoding.net
Категория: Базы данных | Добавил: spravka (27.01.2008) | Автор: Степан
Просмотров: 205 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Имя *:
Email:
WWW:
Код *:
 
 
Категории каталога
Web-программирование [29]
Базы данных [18]
Языки разметки [35]
Web-мастеру [38]
Интернет [19]
Web-дизайн [11]
Уроки Photoshop CS [30]
Уроки CorelDraw [11]
Хостинг [8]
Разные [17]
Лохотрон в Интернете [10]
Заработок в интернете [1]

Форма входа
Логин:
Пароль:

Наш опрос
Оцените мой сайт
Всего ответов: 115

Поиск

Полезные ресурсы

Статистика