Красивый вывод дерева (Nested sets).

off

Новичок
Красивый вывод дерева (Nested sets).

Есть таблица categories.
PHP:
CREATE TABLE categories ( 
  id int(10) unsigned NOT NULL auto_increment, 
  name varchar(128) NOT NULL default '', 
  left_key int(10) unsigned NOT NULL default '0', 
  right_key int(10) unsigned NOT NULL default '0', 
  level int(10) unsigned NOT NULL default '0', 
  parent_id int(10) unsigned NOT NULL default '0', 
  PRIMARY KEY (id), 
  KEY cleft (left_key,right_key,level) 
) TYPE=MyISAM; 

# 
# Дамп данных таблицы 'categories' 
# 

INSERT INTO categories VALUES (162, 'ывфы', 13, 14, 2, 158); 
INSERT INTO categories VALUES (163, 'ывыфв', 6, 11, 3, 159); 
INSERT INTO categories VALUES (164, 'ыфвыфв', 7, 8, 4, 163); 
INSERT INTO categories VALUES (165, 'ыфвфыв', 19, 30, 2, 161); 
INSERT INTO categories VALUES (166, 'фывфыв', 20, 29, 3, 165); 
INSERT INTO categories VALUES (157, 'Новости', 2, 3, 1, 1); 
INSERT INTO categories VALUES (158, 'Статьи', 4, 15, 1, 1); 
INSERT INTO categories VALUES (1, 'Главная', 1, 32, 0, 0); 
INSERT INTO categories VALUES (170, 'wqe', 22, 23, 5, 168); 
INSERT INTO categories VALUES (168, 'цйуйу', 21, 26, 4, 166); 
INSERT INTO categories VALUES (169, 'йцуйцу', 27, 28, 4, 166); 
INSERT INTO categories VALUES (161, 'в', 18, 31, 1, 1); 
INSERT INTO categories VALUES (167, 'цйу', 9, 10, 4, 163); 
INSERT INTO categories VALUES (160, 'ыфв', 16, 17, 1, 1); 
INSERT INTO categories VALUES (159, '2005', 5, 12, 2, 158); 
INSERT INTO categories VALUES (171, 'wqeq', 24, 25, 5, 168);

Есть картинки типа






Как при помощи всего этого сделать древовидную карту сайта (по типу http://www.unesco.ru/rus/pages/sitemap.php), всмысле как правильно поставить картинки, чтобы получилось такое же дерево
 

Necromant

Новичок
прочитал , бы там , общие принципы, проверить есть ли еще ветки , более верхнего уровня, и есть ли еще , ветки и подветки.
 

off

Новичок
чего то я немного не понимаю.
Там написано "Для каждого уровня от начала дерева до родителя текущего элемента рисуем пустой разделитель, если это последний элемент у своего родителя, и вертикальную линию если нет ".

Не могу сообразить как это осуществить.
 

Necromant

Новичок
1
+2
+3
|
+4
Если , у 1 есть потомки и это потомок +,
Если у 2 есть потомки +
еси у 3 нету потомков , если у 2 нету потомков ,
Если у 1 есть еще потомок | ,
Если , у 1 есть потомок
 

off

Новичок
Не понимаю :(

А код можешь написать. Пожалуйста! Мне так понятнее :rolleyes:
 

Necromant

Новичок
PHP:
$tree = array(
   array(level=0, id=1)
   array(level=1, id=2)
   array(level=2, id=3)
   array(level=0)
);

$t = array();
for($i=0;$i>sizeof($tree);$i++) {
     for ($j=0;$j<$tree[$i][level];$j++) {
        if (!$t[j]) echo ' ';
        else echo '|'; 
     }
     
    //если первая в текущем уровне 
     if ($tree[$i-1][level]<$tree[$i][level]) {
            $t[$tree[$i][level]] = 1;
            echo 'L';
     } else {
    
         //если естьветки текущего уровня
         if (isset($tree[$i+1][level])) {
              $t[$tree[$i][level]] = 1;
              echo '|-';
         } else {
         //если нету
              $t[$tree[$i][level]] = 0;
              echo 'L';
        }
   }  
   
    echo $tree[$i][id];
}
 

off

Новичок
Спасибо за код! Но вот тока че-то он не работает. :)

Да и как динамически сформировать массив $tree?

Т.е как с помощью этого цикла?
PHP:
$sql="SELECT * FROM c_tree ORDER BY left_key"; 
$result=mysql_query($sql);
while ($row=mysql_fetch_array($result)){
	$left_key = $row ['left_key'];
	$right_key = $row ['right_key'];
	$level = $row ['level'];
	$name = $row ['name'];
	$parent_id = $row ['parent_id'];
...далее формирование массива
}
 

off

Новичок
PHP:
$sql="SELECT * FROM c_tree ORDER BY left_key"; 
$result=mysql_query($sql);
$tree = array();
while ($row=mysql_fetch_array($result)){
	$left_key = $row ['left_key'];
	$right_key = $row ['right_key'];
	$level = $row ['level'];
	$name = $row ['name'];
	$parent_id = $row ['parent_id'];
	$tree[] = $row; 
}
	
	
   $t = array(); 
for($i=0;$i>sizeof($tree);$i++) { 
     for ($j=0;$j<$tree[$i][level];$j++) { 
        if (!$t[j]) echo ' '; 
        else echo '|'; 
     } 
      
    //если первая в текущем уровне 
     if ($tree[$i-1][level]<$tree[$i][level]) { 
            $t[$tree[$i][level]] = 1; 
            echo 'L'; 
     } else { 
     
         //если естьветки текущего уровня 
         if (isset($tree[$i+1][level])) { 
              $t[$tree[$i][level]] = 1; 
              echo '|-'; 
         } else { 
         //если нету 
              $t[$tree[$i][level]] = 0; 
              echo 'L'; 
        } 
   }   
   
    echo $tree[$i][id]; 
}
Так? Чего-то все равно не работает. Ничего не выводит...
:)
 

off

Новичок
Прочитал. Пробовал, но ошибок не выводит...

может простовначале неправильно сформирован массив?

как правильно-то?
 

Groove

Новичок
Во первых, как тебе косвенно (сслыкой на фак) уже сказал Necromant:
error_reporting(E_ALL);
ini_set('display_errors','On');

Во вторых везде по тексту замени:
$t[$tree[$i][level]] = 1;
на
$t[$tree[$i]['level']] = 1;
 

off

Новичок
Nicromant: поля ID не существует см. echo $tree[$i][id];

Всмысле его не существует?

А во-вторых я сделал все как сказал Groove, но все рвано не работает.

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

off

Новичок
Если так
PHP:
......
//если нету 
              $t[$tree[$i][level]] = 0; 
              echo 'L'; 
        } 
   }    
    
    echo $tree[$i][id]; 
var_dump($tree[$i]); 
}
То ничего не выводит, если же так
PHP:
......
//если нету 
              $t[$tree[$i][level]] = 0; 
              echo 'L'; 
        } 
   }    
    
    echo $tree[$i][id]; 
}

var_dump($tree[$i]);
То выводит только инфу об $tree[0];

array(12) { [0]=> string(1) "1" ["id"]=> string(1) "1" [1]=> string(7) "Главная" ["name"]=> string(7) "Главная" [2]=> string(1) "1" ["left_key"]=> string(1) "1" [3]=> string(2) "32" ["right_key"]=> string(2) "32" [4]=> string(1) "0" ["level"]=> string(1) "0" [5]=> string(1) "0" ["parent_id"]=> string(1) "0" }

-~{}~ 18.09.05 13:15:

Не могу понять. Вся проблема в этой строке echo $tree[$i][id]; ?
 

off

Новичок
Я уже 2 раза прочитал PHP FAQ: Ничего не работает! Что делать???. Все перепробывал. Если делаю так

....
}
echo $i;
echo $tree[$i][id];
}

То он даже $i не выводит. Не могу понять в чем дело. Помоги плиз :) (Мож ошибки исправишь? ) :rolleyes:
 

Necromant

Новичок
for($i=0;$i < [\B] sizeof($tree);$i++)
PHP:
for($i=0;$i<sizeof($tree);$i++) {
	
	for ($j=0;$j<($tree[$i][level]-1);$j++) {
        if (!$t[$j]) echo ' ';
        else echo '|';
     }
      
    //если первая в текущем уровне
     if ($tree[$i-1][level]<$tree[$i][level]) {
            $t[$tree[$i][level]] = 1;
            echo 'L';
     } else {
         //если естьветки текущего уровня
         if (isset($tree[$i+1][level])) {
              $t[$tree[$i][level]] = 1;
              echo '|-';
         } else {
         //если нету
              $t[$tree[$i][level]] = 0;
              $t[$tree[$i+1][level]] = 0;
              echo 'L';
        }
   }   
   
    echo $tree[$i][name]."\n";
}
 
Сверху