A nie możesz użyć rekurencji?
Wycinek kodu z mojego cmsu:
<?php
function menuParentsList($pid=0, $depth=0) {
$rep = $this->_dbObj
->fetchAll("SELECT * FROM `menu` WHERE `parent_id` = :pid ORDER BY `position`", array(":pid" => array("data" => $pid, "dataType" => PDO
::PARAM_INT))); if($rep_c==0)return;
$ret="";
for($i=0; $i<$rep_c; $i++) {
$ret .= str_repeat("\t",$depth)."<option value=\"".$rep[$i]["id"]."\">".str_repeat(" ",$depth).$rep[$i]["name"]."</option>\n"; $ret .= $this->menuParentsList($rep[$i]["id"], ($depth+1)); //Maybe children has childrens? ;]
}
return $ret;
}
function showMenu($pid=0, $depth=0, $insideCall=false) { //If insideCall is true do not add headers (used in recursive call)
$data = $this->_dbObj
->fetchAll("SELECT * FROM `menu` WHERE `parent_id` = :pid ORDER BY `position`", array(":pid" => array("data" => $pid, "dataType" => PDO
::PARAM_INT))); if($data_c==0) {
if(!$insideCall)echo "<b>".LNG_MENU_EMPTY_MENU
."</b>"; return;
}
if(!$insideCall) {
$ret = '<div style="font-size:1.4em; line-height:1.4em; position:relative; left:20px;">';
$ret .= "<dl>";
} else { $ret = ""; }
for($i=0;$i<$data_c;$i++) {
if($data[$i]["link_type"] == "subpage") { //Rewrite link for subpage
$data[$i]["link"] = HTTP_PATH."/page/".$data[$i]["link"]."/page.html";
} elseif($data[$i]["link_type"] == "article") { //Rewrite link for article
$data[$i]["link"] = HTTP_PATH."/article/".$data[$i]["link"]."/article.html";
} else { //Rewrite link for any other (if none fail it`s external link ;])
$data[$i]["link"] = HTTP_PATH
."/redirect/".base64_encode($data[$i]["link"])."/"; }
$ret .= str_repeat("\t",$depth).'<dt id="'.$data[$i]["id"].'-cnt" style="padding-top: 5px;">'.str_repeat(" ",$depth).'<a href="'.$data[$i]["link"].'">'.$data[$i]["name"].'</a> ';
if($i != 0) {
$ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="moveElement(this.id, \'up\');"><img src="images/mve_up.gif"></a> ';
} else {
$ret .= '<img src="images/mve_up_bw.gif"></a> '; //Move up is impossible - it`s first element
}
if(($i+1) != $data_c) {
$ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="moveElement(this.id, \'dwn\');"><img src="images/mve_dwn.gif"></a> ';
} else {
$ret .= '<img src="images/mve_dwn_bw.gif"></a> '; //Move down is impossible - it`s last element
}
$ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="editElement(this.id);"><img src="images/edit.gif"></a> '; //Edit element
$ret .= '<a id="'.$data[$i]["id"].'" href="#" onClick="deleteElement(this.id);"><img src="images/del.gif"></a></dt>'; //Delete element
$ret .= $this->showMenu($data[$i]["id"], ($depth+1), true); //Maybe children has childrens? ;] | do not add html "box"
}
if(!$insideCall) {
$ret .= '</dl></div>';
}
return $ret;
}?>