当前位置:首页 > 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;
}

数据库表结构示例:

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`)
);

查询所有子节点:

$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 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现静态

php实现静态

静态化实现方法 PHP实现静态化主要通过生成HTML文件或缓存机制来减少服务器动态解析的开销。以下是几种常见方法: 生成静态HTML文件 通过file_put_contents()将动态内容保存为H…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php实现注册登录

php实现注册登录

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