当前位置:首页 > PHP

php无限分类的实现

2026-02-13 13:28:22PHP

PHP无限分类的实现方法

无限分类(又称树形分类或多级分类)是常见的需求,例如商品分类、地区划分等。以下是几种实现方式:

邻接表模型(Adjacency List)

邻接表是最简单的实现方式,通过parent_id字段记录父级ID。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    parent_id INT DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES categories(id)
);

递归查询子分类:

function getChildren($parentId = 0) {
    $categories = [];
    $result = mysqli_query($conn, "SELECT * FROM categories WHERE parent_id = $parentId");
    while ($row = mysqli_fetch_assoc($result)) {
        $row['children'] = getChildren($row['id']);
        $categories[] = $row;
    }
    return $categories;
}

路径枚举(Path Enumeration)

通过path字段存储从根到当前节点的路径(如1/3/5)。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    path VARCHAR(255) NOT NULL
);

查询某个节点的所有子节点:

function getDescendants($categoryId) {
    $result = mysqli_query($conn, "SELECT path FROM categories WHERE id = $categoryId");
    $path = mysqli_fetch_assoc($result)['path'];
    return mysqli_query($conn, "SELECT * FROM categories WHERE path LIKE '$path/%'");
}

嵌套集模型(Nested Set)

通过leftright值表示节点在树中的位置。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    lft INT NOT NULL,
    rgt INT NOT NULL
);

查询所有子节点(需先重建左右值):

function getChildren($nodeId) {
    $node = mysqli_fetch_assoc(mysqli_query($conn, "SELECT lft, rgt FROM categories WHERE id = $nodeId"));
    return mysqli_query($conn, "SELECT * FROM categories WHERE lft > {$node['lft']} AND rgt < {$node['rgt']}");
}

闭包表(Closure Table)

单独创建关系表存储节点间的关系。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE category_relations (
    ancestor INT NOT NULL,
    descendant INT NOT NULL,
    depth INT NOT NULL,
    PRIMARY KEY (ancestor, descendant),
    FOREIGN KEY (ancestor) REFERENCES categories(id),
    FOREIGN KEY (descendant) REFERENCES categories(id)
);

查询所有子节点:

php无限分类的实现

function getDescendants($categoryId) {
    $query = "SELECT c.* FROM categories c 
              JOIN category_relations cr ON c.id = cr.descendant
              WHERE cr.ancestor = $categoryId AND cr.depth > 0";
    return mysqli_query($conn, $query);
}

实际应用建议

  1. 简单需求:邻接表最容易实现,适合层级较少的情况
  2. 频繁查询:嵌套集或闭包表性能更好,但写入成本较高
  3. 层级深度:路径枚举适合已知最大深度的情况

每种方法各有优劣,需根据具体场景选择。邻接表最易理解但查询效率低,闭包表最灵活但占用空间大。

标签: php
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…