Помогите с деревом каталога

peshkov

Новичок
Помогите с деревом каталога

Есть скрипт кторый выводит дерево каталога

Проблема в следующем дерево каталога выводиться неправельно
помогите разобраться или посоветуйте что можно зделать только без javascript

SQL Dump

CREATE TABLE `menu` (
`id` int(11) NOT NULL auto_increment,
`pid` int(11) NOT NULL default '0',
`name` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=14 ;

--
-- Дамп данных таблицы `menu`
--

INSERT INTO `menu` VALUES (1, 0, 'qwwwq');
INSERT INTO `menu` VALUES (2, 0, 'qwwwq 2');
INSERT INTO `menu` VALUES (11, 8, 'test');
INSERT INTO `menu` VALUES (3, 0, 'qwwwq 3');
INSERT INTO `menu` VALUES (12, 11, 'test 2');
INSERT INTO `menu` VALUES (7, 1, 'eewew 1');
INSERT INTO `menu` VALUES (8, 1, 'eewew 2');
INSERT INTO `menu` VALUES (9, 1, 'eewew 3');
INSERT INTO `menu` VALUES (13, 9, 'test3');


PHP:
?>Дерево каталога<br><table border="1"><?
function get_tree($parent_id=0,$nbsp=''){
	//sql запрос 
	$i=0;
	$sql = "SELECT * FROM menu WHERE pid='$parent_id'";
	$ok = mysql_query($sql);
	while ($row = mysql_fetch_array($ok)){

		//счетчик оборотов
		$i++;
		//условия для первого уровня
		if ($row['pid']==0){
			$i=0;
		}
		//цикл подсчета отспупа перед вложенными уровнями
		for ($x=0;$x<$i;$x++)
		{
			$nbsp.='&nbsp;';
		}
		//получение имени из базы данных
		$name = $row['name'];
		$level = $row['id'];
		//получение длины отступа и имени 
		print "<TR><TD>$nbsp$name</TD></TR>";
		//вывод информации полученного каталога
		get_tree($row['id'],$nbsp);		
	}
}
get_tree();
?></table>
 

sense

Новичок
Ну найдём мы ошибки... Потом ты спросишь, а как мне теперь этот каталог редактировать - ни удалить, ни переместить не получается, так что иди за специально написанным класом, который неоднократно проверен и РАБОТАЕТ http://dev.e-taller.net/dbtree/dbtree.phps и читай (сам в нете поищи, не помню ссылок) про множественные деревья
 

peshkov

Новичок
Спасибо за столь теплый прем как перемещять удалять добавлять я спрашивать небуду
а вот как зделать чтобы он правельно выводил дервево неполучаеться
 

rotoZOOM

ACM maniac
c $nbsp ты конечно перемудрил.
Достаточно в функцию передавать дополнительный параметр означающий глубину вложенности. Вот его умножай на индент и отсчитывай свои пробелы.
PHP:
define ('DEF_INDENT',4);

function get_tree($parent_id=0,$deep){ 
    //sql запрос  
    $nbsp=str_repeat ("&nbsp;",$deep*DEF_INDENT);
    $sql = "SELECT * FROM menu WHERE pid='$parent_id'"; 
    $ok = mysql_query($sql); 
    while ($row = mysql_fetch_array($ok)){ 
        //получение имени из базы данных 
        $name = $row['name']; 
        $level = $row['id']; 
        //получение длины отступа и имени  
        print "<TR><TD>$nbsp$name</TD></TR>"; 
        //вывод информации полученного каталога 
        get_tree($row['id'],$deep+1);
    } 
}
get_tree (0,0);
Но ... делать отступы пробелами - это конечно сильно :)))
 

maxvd

Новичок
Автор оригинала: rotoZOOM
Достаточно в функцию передавать дополнительный параметр означающий глубину вложенности. Вот его умножай на индент и отсчитывай свои пробелы.
Может чегото не понимаю? если надо с помошью пробелов вывести дерево так не проше
PHP:
function get_tree($parent_id=0,$nbsp=''){       
  
    $sql = "SELECT * FROM menu WHERE pid='$parent_id'";       
    $ok = mysql_query($sql);       
    while ($row = mysql_fetch_assoc($ok)) {                   
         print "<TR><TD>$nbsp{$row['name']}</TD></TR>";
         get_tree($row['id'], $nbsp.'&nbsp;');              
    }      
    return;   
}   
get_tree();
зачем мерить глубину вложености ?
 

rotoZOOM

ACM maniac
maxvd Это уже вариант исполнения. Я привык на Си не засорять стек лишними переменными в рекурсии, поэтому и передаю число, а не строку. Так, что твой вариант - тоже вариант :)
 
Сверху