首页  >  文章  >  数据库  >  如何在没有递归或多个数据库查询的情况下在 PHP 中构建树形结构菜单?

如何在没有递归或多个数据库查询的情况下在 PHP 中构建树形结构菜单?

Barbara Streisand
Barbara Streisand原创
2024-10-27 14:46:01643浏览

How to Build a Tree-Structured Menu in PHP Without Recursion or Multiple Database Queries?

在 PHP 中构建树形结构菜单

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn