当前位置:首页 > PHP

php 无限分类的实现

2026-02-13 14:21:08PHP

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

查询子分类的PHP代码示例:

function getChildren($parentId = 0) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("SELECT * FROM categories WHERE parent_id = ?");
    $stmt->execute([$parentId]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

路径枚举(Path Enumeration)

通过在分类中存储完整路径来优化查询效率。

php 无限分类的实现

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    path VARCHAR(255) NOT NULL COMMENT '如1/2/3'
);

查询示例:

function getByPath($path) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("SELECT * FROM categories WHERE path LIKE ? ORDER BY path");
    $stmt->execute(["$path%"]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

嵌套集模型(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
);

查询子树示例:

php 无限分类的实现

function getSubTree($nodeId) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("
        SELECT node.* 
        FROM categories AS node, categories AS parent 
        WHERE node.lft BETWEEN parent.lft AND parent.rgt 
        AND parent.id = ?
        ORDER BY node.lft
    ");
    $stmt->execute([$nodeId]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

闭包表(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) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("
        SELECT c.* 
        FROM categories c
        JOIN category_relations cr ON c.id = cr.descendant
        WHERE cr.ancestor = ? AND cr.descendant != ?
    ");
    $stmt->execute([$categoryId, $categoryId]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

递归处理分类数据

对于邻接列表模型,可以使用递归方式获取完整树结构:

function buildTree(array $elements, $parentId = 0) {
    $branch = [];
    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }
    return $branch;
}

// 使用方式
$categories = $db->query("SELECT * FROM categories")->fetchAll(PDO::FETCH_ASSOC);
$tree = buildTree($categories);

每种方法各有优缺点:邻接列表简单但查询效率低,嵌套集查询高效但更新复杂,闭包表最灵活但占用空间大。应根据实际业务需求选择合适方案。

标签: php
分享给朋友:

相关文章

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE ord…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php如何实现直播

php如何实现直播

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

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php实现聊天

php实现聊天

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