Дерево mysql, рекурсия

kombo

Новичок
Дерево mysql, рекурсия

Есть известный с некоторыми вариациями код для отображения дерева

function makebranch($parent_id,$table,$level,$maxlevel){
$list=$table[$parent_id];$result="";
asort($list);
while(list($key,$val)=each($list)){

if ($level=="0"){
$output="<img src=/se.gif width=12 height=12>";
}else{
$width=($level+1)*24;
$output="<img src=/e.gif width=$width height=12>";}
$result.= "$output <a href=/?catid=$key>$val</a> ($level) <br>\n";
if ((isset($table[$key])) AND (($maxlevel>$level+1) OR ($maxlevel=="0"))){
$result.= makebranch($key,$table,$level+1,$maxlevel);
}
}
RETURN $result;
}

Что нужно сделать чтобы направить рекурсию по нужной ветке дерева в зависимости от $_GET["catid"]

-~{}~ 22.08.04 03:39:

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

kombo

Новичок
Здесь "мой" код приведен не полностью. Он сделан по способу
table categories
id_______parent_id______name
и дополняется еще
PHP:
function maketree($rootcatid,$query,$maxlevel){

         $result=mysql_query($query);
                 while(list($id,$parent_id,$name)=mysql_fetch_array($result)){
                $table[$parent_id][$id]=$name;
                 $partable[$id][$parent_id]=$name;
                 };
        //$result=buildparent($rootcatid,$table,$partable)."<br>";
         $result.=makebranch($rootcatid,$table,0,$maxlevel);
    RETURN $result;
}

if (!isset($catid)){
$catid=0;
};

$maxlevel=0;
print maketree($catid,"SELECT id,parent_id,name FROM categories order by parent_id",$maxlevel);
-~{}~ 25.08.04 02:31:

Всеж таки получилось. Если кому интересно

PHP:
//--------Добавляем ф-ю
function getroot($id,$partable)
{
foreach($partable[$id] as $parent_id=>$name)
$root_id=$id;
if (isset($partable[$parent_id])) $root_id=getroot($parent_id,$partable);
 RETURN $root_id;
}
//-----В ф-ю makebranch добавляем параметры
function makebranch($parent_id,$table,$level,$maxlevel,$fl=false,$root_id)
//---------И рекурсию стартуем так
                 if($root_id==$key||$fl)   
				 
				 if ((isset($table[$key])) AND (($maxlevel>$level+1) OR ($maxlevel=="0"))){
				  
			  $branch.= makebranch($key,$table,$level+1,$maxlevel,true,$root_id);
//--------Первый раз makebranch вызываем так
function maketree......
.
.
	   if(@$_GET["catid"]) $root_id=getroot($_GET["catid"],$partable);
         $tree=makebranch($rootcatid,$table,0,$maxlevel,false,$root_id);
.
.
 
Сверху