PHP / MySQL构建树菜单

我正在尝试从我的PHP和MySQL数据库中构建一个不被接受的列表菜单树。

我有一个从数据库返回的页面对象数组。每个页面对象都有parent_id属性,如果没有父对象,则将其设置为null。页面对象如下所示:

page object

id

title

parent_id

如果可能的话,我不想递归地做,只打一次数据库,因为我将在几乎每个请求上构建菜单。我想创建一个函数,将其对象数组传递给它,它将返回html列表。

回答:

我喜欢@mario的解决方案,并在防止过度使用方面进行了改进<ul>。我只是建议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 = "<ul>";

foreach ($rows as $row)

{

if ($row['parent_id'] == $parent){

$result.= "<li>{$row['title']}";

if (has_children($rows,$row['id']))

$result.= build_menu($rows,$row['id']);

$result.= "</li>";

}

}

$result.= "</ul>";

return $result;

}

echo build_menu($menu);

输出:

<ul>

<li>Menu 1<ul>

<li>Sub 1.1</li>

<li>Sub 1.2</li>

<li>Sub 1.3</li>

</ul></li>

<li>Menu 2<ul>

<li>Sub 2.1<ul>

<li>Sub Sub 2.1.1</li>

</ul></li>

<li>Sub 2.2</li>

</ul></li>

<li>Menu 3</li>

</ul>

以上是 PHP / MySQL构建树菜单 的全部内容, 来源链接: utcz.com/qa/414606.html

回到顶部