当前位置:首页 > PHP

php实现树形菜单

2026-02-27 15:42:30PHP

PHP实现树形菜单的方法

数据库设计

创建一个表存储菜单项,通常包含字段如idnameparent_id(父级ID,根节点为0或NULL)和order(排序字段)。示例SQL结构:

CREATE TABLE menu_items (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    parent_id INT DEFAULT NULL,
    order INT DEFAULT 0,
    FOREIGN KEY (parent_id) REFERENCES menu_items(id) ON DELETE CASCADE
);

递归查询数据

从数据库获取所有菜单项,使用递归函数构建树形结构:

php实现树形菜单

function buildTree(array $items, $parentId = null) {
    $branch = [];
    foreach ($items as $item) {
        if ($item['parent_id'] == $parentId) {
            $children = buildTree($items, $item['id']);
            if ($children) {
                $item['children'] = $children;
            }
            $branch[] = $item;
        }
    }
    return $branch;
}

// 使用示例
$items = $pdo->query("SELECT * FROM menu_items ORDER BY `order`")->fetchAll(PDO::FETCH_ASSOC);
$tree = buildTree($items);

渲染HTML菜单

通过递归函数生成嵌套的HTML列表:

php实现树形菜单

function renderMenu(array $tree) {
    echo '<ul>';
    foreach ($tree as $node) {
        echo '<li>';
        echo htmlspecialchars($node['name']);
        if (!empty($node['children'])) {
            renderMenu($node['children']);
        }
        echo '</li>';
    }
    echo '</ul>';
}

// 调用渲染
renderMenu($tree);

使用闭包优化

对于大型数据集,可用闭包避免多次循环:

function buildTreeWithClosure(array $items) {
    $grouped = [];
    foreach ($items as $item) {
        $grouped[$item['parent_id']][] = $item;
    }

    $build = function($parentId) use (&$build, $grouped) {
        return array_map(function($item) use ($build) {
            if (isset($grouped[$item['id']])) {
                $item['children'] = $build($item['id']);
            }
            return $item;
        }, $grouped[$parentId] ?? []);
    };

    return $build(0);
}

前端交互增强

结合jQuery实现折叠效果:

<script>
$(document).ready(function() {
    $('.tree-menu li').has('ul').prepend('<span class="toggle">+</span>');
    $('.tree-menu .toggle').click(function() {
        $(this).text($(this).text() === '+' ? '-' : '+')
               .siblings('ul').toggle();
    });
});
</script>

性能优化建议

  • 对静态菜单使用缓存(如Redis或文件缓存)
  • 数据库查询时添加INDEXparent_id字段
  • 超深层级树可改用嵌套集模型(Nested Set)替代邻接表

完整示例代码

// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');

// 获取数据并构建树
$items = $pdo->query("SELECT * FROM menu_items ORDER BY `order`")->fetchAll(PDO::FETCH_ASSOC);
$menuTree = buildTreeWithClosure($items);

// 渲染菜单
echo '<div class="tree-menu">';
renderMenu($menuTree);
echo '</div>';

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

相关文章

css div 制作导航菜单

css div 制作导航菜单

使用 CSS 和 Div 制作导航菜单 导航菜单是网站的重要组成部分,以下是通过 CSS 和 div 元素制作导航菜单的方法。 基本 HTML 结构 创建一个简单的 div 结构作为导航菜单的基础:…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

vue实现导航菜单

vue实现导航菜单

Vue 实现导航菜单的方法 使用 Vue Router 实现基本导航 在 Vue 项目中安装 vue-router,通过路由配置实现页面跳转。路由配置文件中定义路径和组件映射,导航菜单通过 <r…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php session实现购物车

php session实现购物车

PHP Session 实现购物车 初始化 Session 确保在使用 Session 前调用 session_start() 函数。通常放在 PHP 文件的最顶部。 <?php sessio…