当前位置:首页 > PHP

php 实现多级菜单

2026-02-15 04:56:27PHP

实现多级菜单的数据结构

使用递归或迭代方式构建多级菜单的核心是合理设计数据库表结构。常见方案是包含父级ID的邻接表模型:

CREATE TABLE `menu` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL COMMENT '菜单名称',
  `parent_id` int(11) DEFAULT 0 COMMENT '父级ID,0表示一级菜单',
  `sort` int(11) DEFAULT 0 COMMENT '排序权重',
  `url` varchar(255) DEFAULT NULL COMMENT '菜单链接',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

递归方式生成树形结构

通过递归函数遍历所有菜单节点,构建层级关系:

function buildTree(array $elements, $parentId = 0) {
    $branch = [];
    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }
    return $branch;
}

// 使用示例
$flatList = $db->query("SELECT * FROM menu ORDER BY sort DESC");
$tree = buildTree($flatList);

迭代方式生成树形结构

对于大数据量场景,迭代方案比递归更高效且避免栈溢出:

php 实现多级菜单

function buildTreeIterative(array $items) {
    $tree = [];
    $indexed = [];

    // 建立索引
    foreach ($items as $item) {
        $indexed[$item['id']] = $item;
        $indexed[$item['id']]['children'] = [];
    }

    // 构建树
    foreach ($indexed as $id => $item) {
        if ($item['parent_id'] == 0) {
            $tree[] = &$indexed[$id];
        } else {
            $indexed[$item['parent_id']]['children'][] = &$indexed[$id];
        }
    }
    return $tree;
}

前端渲染方案

将生成的树形数据通过HTML模板渲染:

function renderMenu(array $menu) {
    $html = '<ul>';
    foreach ($menu as $item) {
        $html .= '<li>';
        $html .= '<a href="'.$item['url'].'">'.$item['name'].'</a>';
        if (!empty($item['children'])) {
            $html .= renderMenu($item['children']);
        }
        $html .= '</li>';
    }
    $html .= '</ul>';
    return $html;
}

echo renderMenu($tree);

性能优化建议

对于频繁读取但很少变更的菜单,建议将生成的树形结构缓存:

php 实现多级菜单

$cacheKey = 'menu_tree';
if (!$tree = $cache->get($cacheKey)) {
    $tree = buildTree($flatList);
    $cache->set($cacheKey, $tree, 3600);
}

替代方案:闭包表模型

当层级深度较大时,可考虑改用闭包表(Closure Table)存储关系:

CREATE TABLE `menu_closure` (
  `ancestor` int(11) NOT NULL,
  `descendant` int(11) NOT NULL,
  `depth` int(11) NOT NULL,
  PRIMARY KEY (`ancestor`,`descendant`)
);

查询所有子节点的SQL示例:

SELECT m.* FROM menu m
JOIN menu_closure c ON m.id = c.descendant
WHERE c.ancestor = 1 AND c.depth > 0

标签: 菜单php
分享给朋友:

相关文章

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单用于导航,右侧区域根据菜单选择动态展示内容。 创建左侧菜单组件 左侧菜单通常是一个列表,可…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

css制作下拉菜单

css制作下拉菜单

使用纯CSS制作下拉菜单 通过HTML和CSS可以创建无需JavaScript的下拉菜单,主要利用:hover伪类和display属性控制显示隐藏。 HTML结构示例: <div class…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…

php登陆功能实现

php登陆功能实现

实现PHP登录功能 数据库准备 创建一个用户表存储登录信息,基本字段包括用户名、密码(需加密)等: CREATE TABLE users ( id INT AUTO_INCREMENT PR…

vue实现菜单管理

vue实现菜单管理

Vue 实现菜单管理方案 方案一:基于路由的动态菜单 通过 Vue Router 的路由配置自动生成菜单结构,适用于权限管理系统。在路由元信息(meta)中添加菜单相关配置: const route…