当前位置:首页 > PHP

php实现无限分类

2026-02-27 23:22:40PHP

PHP实现无限分类的方法

无限分类是一种常见的数据库设计模式,适用于多层级分类结构(如商品分类、地区划分等)。以下是几种实现方式:

递归实现法

递归方法适合层级较少的情况,代码简洁但性能随层级加深可能下降。

function getTree($data, $pid = 0, $level = 0) {
    static $tree = [];
    foreach ($data as $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $tree[] = $v;
            getTree($data, $v['id'], $level + 1);
        }
    }
    return $tree;
}

数据库表结构示例:

php实现无限分类

CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `pid` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
);

闭包表设计法

通过额外的关系表存储所有节点间的路径,查询效率高但结构复杂。

-- 节点表
CREATE TABLE `node` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
);

-- 路径关系表
CREATE TABLE `path` (
  `ancestor` int(11) NOT NULL,
  `descendant` int(11) NOT NULL,
  `depth` int(11) NOT NULL,
  PRIMARY KEY (`ancestor`,`descendant`)
);

查询所有子节点:

php实现无限分类

$sql = "SELECT n.* FROM node n 
        JOIN path p ON n.id = p.descendant 
        WHERE p.ancestor = :parent_id";

预排序遍历树算法(MPTT)

通过左右值编码实现高效查询,适合读多写少的场景。

CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `lft` int(11) NOT NULL,
  `rgt` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

查询子树示例:

function getSubTree($rootId) {
    $sql = "SELECT node.* FROM category AS node, 
            category AS parent 
            WHERE node.lft BETWEEN parent.lft AND parent.rgt 
            AND parent.id = ? 
            ORDER BY node.lft";
    // 执行查询...
}

扁平数组转树结构

从数据库获取扁平数组后,在PHP中转换为树形结构:

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

性能优化建议

  • 递归法适合层级固定且较浅的场景
  • 闭包表在频繁查询时性能最优
  • MPTT适合读多写少的业务场景
  • 大数据量建议配合缓存使用
  • 前端展示时可使用jQuery树插件如zTree或jsTree

每种方法各有优劣,选择时需根据具体业务场景的读写比例、数据量大小等因素综合考虑。

标签: php
分享给朋友:

相关文章

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php实现注册登录

php实现注册登录

PHP 注册功能实现 创建数据库表(以 MySQL 为例) CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…

php session实现购物车

php session实现购物车

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