Here is the full thing:
PHP Code:
$arrRows = array();
$strSQL = 'SELECT c.cats_id,c.parents_id,c.name,c.sort_order FROM CATS c';
$objPDO = ActiveRecord::getConnection();
if($objPDOSTMT = $objPDO->prepare($strSQL)) {
if($objPDOSTMT->execute()) {
while($arrRow = $objPDOSTMT->fetch(PDO::FETCH_ASSOC)) {
$arrRows[] = $arrRow;
}
}
}
parse_into_menu(parse_into_tree(null,$arrRows,'cats_id','parents_id','cats'),'cats','name');
function parse_into_tree($intParentId,&$arrRows,$strIdField,$strParentsIdField,$strNameResolution) {
$arrChildren = array();
for($i=0;$i<count($arrRows);$i++) {
if($intParentId === $arrRows[$i][$strParentsIdField]) {
$arrChildren = array_merge($arrChildren,array_splice($arrRows,$i--,1));
}
}
$intChildren = count($arrChildren);
if($intChildren != 0) {
for($i=0;$i<$intChildren;$i++) {
$arrChildren[$i][$strNameResolution] = parse_into_tree($arrChildren[$i][$strIdField],$arrRows,$strIdField,$strParentsIdField,$strNameResolution);
}
}
return $arrChildren;
}
function parse_into_menu($arrMenu,$strChildKey,$strNameKey,$intRunner=0) {
$strNL = "\n";
$intMenu = count($arrMenu);
for($i=0;$i<$intMenu;$i++) {
if($i==0) {
echo str_repeat("\t",$intRunner),'<ul>',$strNL;
}
if(!empty($arrMenu[$i][$strChildKey])) {
echo str_repeat("\t",$intRunner+1),'<li>',$arrMenu[$i][$strNameKey],$strNL;
parse_into_menu($arrMenu[$i][$strChildKey],$strChildKey,$strNameKey,$intRunner+2);
echo str_repeat("\t",$intRunner+1),'</li>',$strNL;
} else {
echo str_repeat("\t",$intRunner+1),'<li>',$arrMenu[$i][$strNameKey],'</li>',$strNL;
}
if($i==($intMenu-1)) {
echo str_repeat("\t",$intRunner),'</ul>',$strNL;
}
}
}
Output:
HTML Code:
<ul>
<li>Tv & Video
<ul>
<li>Televisions</li>
<li>DVD Players</li>
</ul>
</li>
<li>Audio
<ul>
<li>Car Audio</li>
<li>Music
<ul>
<li>Compact Discs
<ul>
<li>Alternative</li>
<li>Rock</li>
<li>Rap</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Toys & Games</li>
<li>Cameras & Camcorders</li>
<li>Cell Phone & Office</li>
</ul>
Bookmarks