当前位置:首页 > PHP

php 无限分类的实现

2026-01-14 13:33:45PHP

无限分类的实现方法

无限分类通常用于构建树形结构数据,如商品分类、多级菜单等。以下是几种常见的实现方式:

邻接列表模型(Adjacency List)

邻接列表是最简单的实现方式,通过在每个节点中存储父节点的ID来构建层级关系。

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

嵌套集模型(Nested Set)

嵌套集模型通过left和right值来表示节点在树中的位置,查询效率高但更新复杂。

php 无限分类的实现

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

查询子树:

SELECT node.* 
FROM categories AS node, categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.id = 1
ORDER BY node.lft;

路径枚举(Path Enumeration)

通过存储从根节点到当前节点的完整路径来实现。

php 无限分类的实现

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

查询子节点:

SELECT * FROM categories WHERE path LIKE '1/2/%';

闭包表(Closure Table)

使用单独的关联表存储节点之间的关系,是最灵活的实现方式。

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

CREATE TABLE category_closure (
    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)
);

查询所有后代节点:

SELECT c.* 
FROM categories c
JOIN category_closure cc ON c.id = cc.descendant
WHERE cc.ancestor = 1 AND cc.descendant != 1;

性能比较

  • 邻接列表:简单易用,但递归查询性能较差
  • 嵌套集:查询性能好,但更新操作复杂
  • 路径枚举:简单,但依赖字符串操作
  • 闭包表:最灵活,查询和更新都方便,但需要额外表

实际应用建议

对于中小型项目,邻接列表或路径枚举足够简单实用。大型项目建议使用闭包表或嵌套集模型。现代框架如Laravel的Eloquent已内置对树形结构的支持,可简化开发。

标签: php
分享给朋友:

相关文章

php实现递归

php实现递归

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

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…