当前位置:首页 > PHP

php 实现无限分类

2026-02-27 12:58:18PHP

无限分类的实现方法

无限分类通常用于构建多级分类系统,如商品分类、文章分类等。以下是几种常见的实现方法:

邻接表模型(Adjacency List Model)

邻接表模型是最简单的实现方式,通过父ID字段来建立层级关系。每个记录存储一个指向其父记录的ID。

php 实现无限分类

// 数据库表结构示例
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    parent_id INT DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE CASCADE
);
// 递归获取所有子分类
function getChildCategories($parentId = 0, $level = 0) {
    static $categories = [];
    $query = "SELECT * FROM categories WHERE parent_id = " . (int)$parentId;
    $result = mysqli_query($connection, $query);

    while ($row = mysqli_fetch_assoc($result)) {
        $row['level'] = $level;
        $categories[] = $row;
        getChildCategories($row['id'], $level + 1);
    }

    return $categories;
}

路径枚举模型(Path Enumeration Model)

这种方法通过存储从根节点到当前节点的完整路径来表示层级关系。

// 数据库表结构示例
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    path VARCHAR(255) NOT NULL COMMENT '如:1/2/3'
);
// 获取某个分类的所有子分类
function getChildCategories($categoryId) {
    $query = "SELECT * FROM categories WHERE path LIKE '" . (int)$categoryId . "/%'";
    $result = mysqli_query($connection, $query);
    return mysqli_fetch_all($result, MYSQLI_ASSOC);
}

嵌套集模型(Nested Set Model)

嵌套集模型使用左右值来表示节点在树中的位置,查询效率高但更新复杂。

php 实现无限分类

// 数据库表结构示例
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    lft INT NOT NULL,
    rgt INT NOT NULL
);
// 获取某个节点的所有子节点
function getChildCategories($nodeId) {
    $query = "SELECT node.* FROM categories AS node, 
              categories AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt 
              AND parent.id = " . (int)$nodeId;
    $result = mysqli_query($connection, $query);
    return mysqli_fetch_all($result, MYSQLI_ASSOC);
}

闭包表模型(Closure Table Model)

闭包表使用单独的关系表来存储节点之间的所有路径关系,是最灵活的实现方式。

// 数据库表结构示例
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

CREATE TABLE category_paths (
    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 getChildCategories($nodeId) {
    $query = "SELECT c.* FROM categories c 
              JOIN category_paths cp ON c.id = cp.descendant
              WHERE cp.ancestor = " . (int)$nodeId;
    $result = mysqli_query($connection, $query);
    return mysqli_fetch_all($result, MYSQLI_ASSOC);
}

实现建议

邻接表模型简单易实现,适合层级不深且不频繁查询的场景。嵌套集和闭包表查询效率高,但维护成本较高。路径枚举实现简单且查询方便,但路径长度有限制。

在实际应用中,可以根据业务需求选择合适的方法。对于中小型项目,邻接表或路径枚举通常足够;对于大型复杂项目,建议考虑嵌套集或闭包表。

标签: php
分享给朋友:

相关文章

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数:…

php 实现队列

php 实现队列

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