当前位置:首页 > 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)。

php无限分类的实现

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值表示节点在树中的位置。

php无限分类的实现

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

查询所有子节点:

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 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php实现图片上传

php实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="uploa…

php实现定时任务

php实现定时任务

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