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

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

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

查询子树示例:

// 获取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实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('lo…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php 实现接口

php 实现接口

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

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…

php实现即时通讯

php实现即时通讯

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