当前位置:首页 > 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
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

css div 制作导航菜单

css div 制作导航菜单

基本导航菜单结构 使用HTML创建一个简单的导航菜单结构,通常使用<ul>和li>列表实现。每个菜单项用<a>标签包裹以实现链接功能。 <div class="n…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…