首页  >  文章  >  数据库  >  如何使用 PHP 和 MySQL 构建无限级菜单:递归解决方案?

如何使用 PHP 和 MySQL 构建无限级菜单:递归解决方案?

Susan Sarandon
Susan Sarandon原创
2024-11-01 13:12:30571浏览

How to Build Unlimited-Level Menus with PHP and MySQL: A Recursive Solution?

使用 PHP 和 MySQL 构建无限级菜单

要构建具有多个级别和子菜单的复杂菜单,常见的方法是利用数据库组织菜单项的结构。在这种结构中,顶级菜单的父级 ID 通常为 0,而子菜单则分配其父级菜单的 ID。

当您需要递归检查子菜单并在各自的子菜单中显示它们时,就会出现一个挑战列出项目。以下是使用 PHP 和 MySQL 完成此操作的方法:

MySQL 查询:

SELECT id, parent_id, name, link, position
FROM menu_item
ORDER BY parent_id, position;

此查询根据父子关系按分层顺序获取所有菜单项

PHP 实现:

<code class="php">$html = '';
$parent = 0; // Starting with the top-level menu
$parent_stack = array(); // Keeps track of parent menu IDs

// Map menu items by their parent ID
$children = array();
foreach ($items as $item) {
    $children[$item['parent_id']][] = $item;
}

while (
    // If there are more children at the current parent level
    ($option = each($children[$parent])) ||
    // Or if we need to backtrack to a previous parent level
    ($parent > 0)
) {
    if (!empty($option)) {
        // Handle menu items with children
        if (!empty($children[$option['value']['id']])) {
            $html .= '<li>' . $option['value']['name'] . '</li>';
            $html .= '<ul class="submenu">';
            array_push($parent_stack, $parent); // Push current parent ID to the stack
            $parent = $option['value']['id']; // Set current parent to the current menu item's ID
        }
        // Handle menu items without children
        else {
            $html .= '<li>' . $option['value']['name'] . '</li>';
        }
    } else {
        // Backtrack to the previous menu level
        $html .= '</ul>';
        $parent = array_pop($parent_stack); // Pop the last parent ID from the stack
    }
}

// Output the resulting HTML
echo $html;</code>

说明:

  1. PHP 代码创建一个堆栈跟踪父菜单 ID ($parent_stack)。
  2. 它根据父子关系循环遍历菜单项。
  3. 如果菜单项有子项,则会将其添加到末尾带有嵌套
      的 HTML 输出字符串其子菜单。
  4. 当前父级 ID 被压入堆栈,并将当前父级设置为当前菜单项的 ID。
  5. 如果菜单项没有子级,则它只是作为
  6. 添加到 HTML 输出字符串中。
  7. 如果当前父级不再有子级或者堆栈不为空,则从堆栈中弹出当前父级,并且当前parent 设置为弹出的 ID。
  8. 循环继续,直到处理完所有菜单项。

这种方法提供了一种灵活高效的方法来构建具有无限级别子菜单的菜单没有递归可能发生的无限循环的风险。

以上是如何使用 PHP 和 MySQL 构建无限级菜单:递归解决方案?的详细内容。更多信息请关注PHP中文网其他相关文章!

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