首页  >  文章  >  数据库  >  如何使用递归 PHP 函数从存储在 MySQL 数据库中的分层数据有效地生成 HTML 菜单树?

如何使用递归 PHP 函数从存储在 MySQL 数据库中的分层数据有效地生成 HTML 菜单树?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-29 18:34:02215浏览

How can I efficiently generate an HTML menu tree from hierarchical data stored in a MySQL database using a recursive PHP function?

使用递归函数回显菜单树

如果你有一个 MySQL 数据库,其中分层数据组织在不同的根下,你可能会遇到需要生成一个复制此结构的 HTML 菜单树。这涉及到以递归方式显示根类别及其子类别。

为了实现此目的,可以使用递归 PHP 函数来遍历数据库记录并构建 HTML 标记。该函数需要类别数据以及可选的父标识符和深度级别。

该函数迭代类别,搜索与指定父级匹配的元素。如果找到匹配,它会生成一个

  • 。带有包含类别名称的锚标记的元素。然后,它递归地调用自身来获取并附加子类别(如果有)。此过程持续进行,直到遍历完层次结构的所有级别。

    以下修订后的 PHP 函数包含优化以防止空

      。当没有子类别时出现的元素:
    <code class="php">function recurse($categories, $parent = null, $level = 0) {
      $ret = '<ul>';
      foreach ($categories as $index => $category) {
        if ($category['root'] == $parent) {
          $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
          $sub = $this->recurse($categories, $category['id'], $level + 1);
          if ($sub != '<ul></ul>') {
            $ret .= $sub;
          }
          $ret .= '</li>';
        }
      }
      return $ret . '</ul>';
    }</code>

    为了提高性能,建议查询数据库以包含一个指示每个类别的子类别数量的字段。此信息可用于确定是否递归遍历子类别:

    <code class="php">select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category</code>

    通过此增强功能,可以相应地修改递归函数:

    <code class="php">function recurse($categories, $parent = null, $level = 0) {
      $ret = '<ul>';
      foreach ($categories as $index => $category) {
        if ($category['root'] == $parent) {
          $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
          if ($category['ChildCount'] > 0) {
            $ret .= $this->recurse($categories, $category['id'], $level + 1);
          }
          $ret .= '</li>';
        }
      }
      return $ret . '</ul>';
    }</code>
  • 以上是如何使用递归 PHP 函数从存储在 MySQL 数据库中的分层数据有效地生成 HTML 菜单树?的详细内容。更多信息请关注PHP中文网其他相关文章!

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