Опять про деревья

vladimirsob

Новичок
Опять про деревья

Здравствуйте уважаемые эксперты!
Я сделал вот такую таблицу для хранения древовидного меню в БД:
CREATE TABLE `catalogs` (
`cat_id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL default '0',
`cat_name` varchar(200) NOT NULL default '',
PRIMARY KEY (`cat_id`)
);

INSERT INTO `catalogs` VALUES (1, 0, 'Программирование');
INSERT INTO `catalogs` VALUES (2, 1, 'Веб программирование');
INSERT INTO `catalogs` VALUES (3, 1, 'Системное программирование');
INSERT INTO `catalogs` VALUES (4, 2, 'PHP');
INSERT INTO `catalogs` VALUES (5, 2, 'Perl');
... и т.д.

и вот такой код для вывода этого дерева:
function get_tree($parent_id = 0, $prefix = "") {
global $out;
$query = "SELECT * FROM catalogs WHERE parent_id = '$parent_id'";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
$out .= "+".$prefix.$row['cat_name']."<br>";
get_tree($row['cat_id'], "".$prefix."&nbsp;&nbsp;");
}
return $out;
}
echo get_tree();

Дерево выводится вместе со всеми подразделами.
Я начинающий программист и быть Вы подскажете как мне сделать пошаговый вывод меню?
Т.е. я нажимаю на первый раздел и только после этого открывает под раздел и т.д.
Заранее спасибо!!!
 

vladimirsob

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

Фанат

oncle terrible
Команда форума
Я сделал вот такую таблицу для хранения древовидного меню в БД:
и вот такой код для вывода этого дерева:
Ну и зачем обманывать тогда?

Сейчас выяснится, что ты и не начинающий, и не программист вовсе. Так?
 

Фанат

oncle terrible
Команда форума
Учатся по-другому.
Не "подскажите (а на самом деле - напишите) пошаговый вывод", а "помогите разобраться, как это работает, чтобы я мог сам сделать пошаговый"
 

vladimirsob

Новичок
"помогите разобраться, как это работает, чтобы я мог сам сделать пошаговый" - именно это я и имел в виду!

-~{}~ 05.02.07 13:47:

PHP:
$query = "SELECT * FROM catalogs WHERE parent_id = '0'";      
$result = mysql_query($query);      
while ($row = mysql_fetch_array($result)) {  
$id = $row['cat_id'];
$par = $row['parent_id'];
$name = $row['cat_name']; 
echo "-<a href=1.php?sub=$id>$name</a><br>";
if (isset($sub)) {
  $query = "SELECT * FROM catalogs WHERE parent_id = $sub";      
  $result = mysql_query($query);      
  while ($row = mysql_fetch_array($result)) {  
    $id = $row['cat_id'];
    $par = $row['parent_id'];
    $name = $row['cat_name'];
    echo "--<a href=1.php>$name</a><br>";
  }
}
Вот так я исправил немножко и теперь можно вывести первый под уровень, но ведь глупо вручную выводить каждый под раздел, вдруг их сто например... и когда нажимаю на первый раздел - появляются его подразделы, но остальные разделы которые были ниэже исчезают... подскажи плиз...
 

Фанат

oncle terrible
Команда форума
Во-первых, надо учиться писать код с отступами. чтоы понимать, какая часть кода в какую входит.
визуально видеть, а не шевеля губами скобочки считать.

во-вторых, вручную, конечно, добавлять уровни не стоит. надо разработать алгоритм.

в-третьих, в самую первую очередь, надо сначала разобраться с отображением.
будут ли у тебя полностью раскрыты все уровни всех подменю, или только тот раздел, к которому относится открытый сейчас пункт?
 

vladimirsob

Новичок
Вот над этим алгоритмом я и думаю.
Изначально меню должно быть закрыто и открываться пошагово... т.е. я нажимаю на раздел 1, попадаю в раздел 1.1, нажимаю на него и попадаю в раздел 1.2, но при этом разделы уровня 1 - раздел 2, раздел 3 и т.д. должны быть закрыты... и вот как это сделать я пока не понимаю.
 

vladimirsob

Новичок
Вот например мы в каком то разделе:
Раздел 1
Раздел 1.1
Раздел 1.1.1
Раздел 1.2
Раздел 1.3
Раздел 2
раздел 3

Т.е. мне нужно что бы меню было открыта только когда мы в каком то разделе и именно на нем.
 

Фанат

oncle terrible
Команда форума
то есть, вот так?
Раздел 1
Раздел 1.1
Раздел 1.1.1
Раздел 1.1.1.1
Раздел 1.1.2
Раздел 1.1.3
Раздел 1.2
Раздел 1.3
Раздел 2
раздел 3
раскрываются все подпункты всех подменю всех присутствующиъ разделов?
 

vladimirsob

Новичок
именно так...
-Раздел 1
--Раздел 1.1
---Раздел 1.1.1
----Раздел 1.1.1.1(мы сейчас здесь)
---Раздел 1.1.2
---Раздел 1.1.3
--Раздел 1.2
--Раздел 1.3
-Раздел 2
-раздел 3

Вот это я хочу сделать. Я понимаю как сделать любое кол-во уровней вручную, но как это сделать автоматически...
 

Фанат

oncle terrible
Команда форума
мне такая структура не нравится
мне больше нравится
Раздел 1
Раздел 1.1
Раздел 1.1.1
Раздел 1.1.1.1
Раздел 2
раздел 3
а то больно много текста на экране - в глазах рябит.
но если ты хочешь так, как нарисовал, то без ядреной рекурсии не обойтись. боюсь, это для тебя слишком сложно будет.

-~{}~ 05.02.07 17:19:

ты вообще понимаешь, что такое рекурсия?

-~{}~ 05.02.07 17:21:

примерно такая же функция, кук у тебя вверху, только условие надо ставить - если уровень больше текущего, то не продолжать ветку.
 

vladimirsob

Новичок
Слышал про рекурсию, но как сделать вот это:
примерно такая же функция, кук у тебя вверху, только условие надо ставить - если уровень больше текущего, то не продолжать ветку.

я не понимаю... может кто нить подскажет?
 
Сверху