小编典典
我喜欢@mario的解决方案,并在防止过度使用方面进行了改进
- 。我只是建议ORDER
BY对您的SQL查询执行一个操作,以按您想要的顺序获取菜单(甚至可能建议将权重/序列列添加到架构中。
数据设置:
$menu = array( // Presumed to have been coming from a SQL SELECT, populated for demo.
array('id'=>1,'title'=>'Menu 1', 'parent_id'=>null),
array('id'=>2,'title'=>'Sub 1.1', 'parent_id'=>1),
array('id'=>3,'title'=>'Sub 1.2', 'parent_id'=>1),
array('id'=>4,'title'=>'Sub 1.3', 'parent_id'=>1),
array('id'=>5,'title'=>'Menu 2', 'parent_id'=>null),
array('id'=>6,'title'=>'Sub 2.1', 'parent_id'=>5),
array('id'=>7,'title'=>'Sub Sub 2.1.1', 'parent_id'=>6),
array('id'=>8,'title'=>'Sub 2.2', 'parent_id'=>5),
array('id'=>9,'title'=>'Menu 3', 'parent_id'=>null),
);
处理:
function has_children($rows,$id) {
foreach ($rows as $row) {
if ($row['parent_id'] == $id)
return true;
}
return false;
}
function build_menu($rows,$parent=0)
{
$result = "
- ";
foreach ($rows as $row)
{
if ($row['parent_id'] == $parent){
$result.= "
{$row['title']}";if (has_children($rows,$row['id']))
$result.= build_menu($rows,$row['id']);
$result.= "
";}
}
$result.= "
";return $result;
}
echo build_menu($menu);
输出:
- Menu 1
- Sub 1.1
- Sub 1.2
- Sub 1.3
- Menu 2
- Sub 2.1
- Sub Sub 2.1.1
- Sub 2.2
- Sub 2.1
- Menu 3
2020-05-17