$rows = $db->loadObjectList(); // establish the hierarchy of the menu $children = array(); //var_dump($rows); // first pass - collect children foreach ($rows as $v ) { $pt = $v->parent; $list = @$children[$pt] ? $children[$pt] : array(); array_push( $list, $v ); $children[$pt] = $list; } //var_dump($children); // second pass - get an indent list of the items $list = JHTML::_('menu.treerecurse', 0, '', array(), $children, max( 0, $levellimit-1 ) ); 无限极菜单,上面代码循环将所有的父级保存在数组当中! function treerecurse( $id, $indent, $list, &$children, $maxlevel=9999, $level=0, $type=1 ) { if (@$children[$id] && $level <= $maxlevel) { foreach ($children[$id] as $v) { $id = $v->id; if ( $type ) { $pre = '<sup>|_</sup> '; $spacer = '. '; } else { $pre = '- '; $spacer = ' '; } if ( $v->parent == 0 ) { $txt = $v->name; } else { $txt = $pre . $v->name; } $pt = $v->parent; $list[$id] = $v; $list[$id]->treename = "$indent$txt"; $list[$id]->children = count( @$children[$id] ); $list = JHTMLMenu::TreeRecurse( $id, $indent . $spacer, $list, $children, $maxlevel, $level+1, $type ); } } return $list; } 迭代数组,将所有相匹配子级跟在相应父级后面,父级通过递归,一级一级的将所有菜单顺序显示! $id 默认为0