使用 PHP 和 MySQL 构建菜单树涉及呈现数据库中菜单项的分层列表。本文解决了用户关于如何在不递归或多次访问数据库的情况下实现此目的的查询。
数据结构:
提供的示例描述了从数据库,其中每个对象都有一个 id、title 和parent_id。 Parent_id 为 null 表示根级菜单项。
<code class="php">page object id title parent_id</code>
解决方案:
建议的方法是对数据库中的菜单项进行预排序,以确保所需的顺序。这可以通过向数据库模式添加权重或序列列并按该列对查询结果进行排序来完成。
<code class="php">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; }</code>
示例输出:
给定提供的菜单项:
<code class="php">$menu = array( 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), );</code>
调用 build_menu($menu) 将产生以下 HTML 输出:
<code class="html"><ul> <li>Menu 1 <ul> <li>Sub 1.1</li> <li>Sub 1.2</li> <li>Sub 1.3</li> </ul> <li>Menu 2 <ul> <li>Sub 2.1 <ul> <li>Sub Sub 2.1.1</li> </ul> <li>Sub 2.2</li> </ul> <li>Menu 3</li> </ul></code>
以上是如何在没有递归或多个数据库查询的情况下在 PHP 中构建树形结构菜单?的详细内容。更多信息请关注PHP中文网其他相关文章!