当前位置:首页 > PHP

php无限分类的实现

2026-02-27 12:07:08PHP

PHP无限分类的实现方法

无限分类(也称为多级分类或树状分类)是一种常见的数据结构需求,适用于商品分类、文章分类等场景。以下是几种实现方式:

邻接列表模式(Adjacency List)

这是最简单的实现方式,通过父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)

通过存储完整路径来优化查询效率:

php无限分类的实现

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

查询子分类示例:

// 查询ID为5的分类的所有子分类
$result = mysqli_query($conn, "SELECT * FROM categories WHERE path LIKE '5/%'");

嵌套集模式(Nested Set)

通过左右值编码实现高效查询:

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

查询子树示例:

php无限分类的实现

// 获取ID为5的分类及其所有子分类
$node = mysqli_fetch_assoc(mysqli_query($conn, "SELECT lft, rgt FROM categories WHERE id = 5"));
$result = mysqli_query($conn, 
    "SELECT * FROM categories WHERE lft BETWEEN {$node['lft']} AND {$node['rgt']} ORDER BY lft"
);

闭包表模式(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 getAllDescendants($categoryId) {
    $query = "SELECT c.* FROM categories c
              JOIN category_relations cr ON c.id = cr.descendant
              WHERE cr.ancestor = $categoryId AND cr.descendant != $categoryId";
    return mysqli_query($conn, $query);
}

性能对比

  1. 邻接列表:简单易实现,但递归查询性能较差
  2. 路径枚举:查询效率高,但维护路径复杂
  3. 嵌套集:查询效率最高,但插入/移动节点成本高
  4. 闭包表:查询和维护都较高效,但需要额外表

实际应用建议

对于中小型项目,推荐使用邻接列表+缓存的方式:

// 使用缓存存储整个分类树
function getCategoryTree() {
    $cacheKey = 'category_tree';
    if ($tree = cache_get($cacheKey)) {
        return $tree;
    }

    $tree = buildTreeFromDB();
    cache_set($cacheKey, $tree, 3600);
    return $tree;
}

对于大型系统,建议考虑嵌套集或闭包表实现,必要时可以结合Elasticsearch等搜索引擎优化查询性能。

标签: php
分享给朋友:

相关文章

php实现增删改查

php实现增删改查

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

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…