Помогите найти скрипт (древовидный каталог)

Dee Mon
На сайте с 30.12.2007
Offline
2
746

Доброго времени суток!

Помогите, пожалуйста, найти скрипт древовидного каталога. Имеется таблица в БД - идентификатор записи, название, родитель. Нужен скрип, который на основе извлеченных из БД данных, будет строить древовидный список следующего вида.

Раздел1

-Раздел11

-Раздел12

--Раздел121

Раздел2

И т.п.

Заранее благодарен

grey109
На сайте с 15.06.2005
Offline
180
#1

Задача не сложная. Если БД - это MySQL, то для твоей структуры таблицы, думаю подойдет

http://www.codenet.ru/webmast/php/tree.php

Dee Mon
На сайте с 30.12.2007
Offline
2
#2

Спасибо! Очень выручили.

N
На сайте с 15.08.2007
Offline
5
#3

Бяка способ. На каждый узел дерева по одному запросу - жирновато, как мне кажется. Всё дерево целиком можно получить одним запросом, а потом рекурсией (которая и в этом примере используется, правда, довольно бездарно) его перестроить...

Навскидку код будет выглядеть примерно так. Пишу навскидку прямо в форуме, без проверки. Надеюсь, ошибок не наляпаю, но будьте к ним готовы :). Впрочем, понять суть метода, думаю, можно.


define('NODE_BEGINS', '<ul>'); // html-код, который будет вставляться в начале узла
define('NODE_ENDS', '</url>'); // html-код, который будет вставляться в начале узла
define('LEAF_BEGINS', '<li>'); // html-код, который будет вставляться в начале листа ветви
define('LEAF_ENDS', '</li>'); // html-код, который будет вставляться в конце ветви

$res = mysql_query('SELECT id, parent_id, title FROM catalogue ');
$tree = array();

while ($row = mysql_fetch_object($res)) {
$tree[$row->parent_id][$row->id] = $row->title;
}

print _recurse($tree);

/**
* Рекурсивно обходит дерево и возвращает HTML
*
* @param array $tree
* @param integer $parent_id
* @return string
*/
function _recurse($tree, $parent_id = 0)
{
$code = NODE_BEGINS;

foreach ($tree as $id => $root) {
if ($parent_id != $id) {
continue;
}

if (count($root)) {
foreach ($root as $key => $title){
$code.= LEAF_BEGINS;

// Нужна ссылка? Измените строчку ниже. Как - догадайтесь сами ;)
$code.= $title;

if (count($tree[$key])) {
$code.= _recurse($tree, $key);
}

$code.= LEAF_ENDS;
}
}
}
$code.= NODE_ENDS;
return $code;
}

Не знаю, будет ли работать на PHP4, меня провидение миловало, не пришлось с ним работать :) Я просто попытался максимально примитизировать идею, поэтому код получился грязноватым. Если кому интересно, могу "правильно" (т.е. с ООП :)) переписать этот же код на PHP5.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий