当前位置:首页 > PHP

php 实现无限分类

2026-01-14 13:29:07PHP

无限分类的实现方法

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

邻接列表模型(Adjacency List)

这是最简单的实现方式,每个分类记录存储其父分类的ID。

// 数据库表结构示例
CREATE TABLE categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    parent_id INT DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES categories(id)
);
// 获取所有分类
function getCategories($parentId = null) {
    $categories = [];
    $query = "SELECT * FROM categories WHERE parent_id " . ($parentId === null ? "IS NULL" : "= " . (int)$parentId);
    $result = mysqli_query($connection, $query);

    while ($row = mysqli_fetch_assoc($result)) {
        $row['children'] = getCategories($row['id']);
        $categories[] = $row;
    }

    return $categories;
}

嵌套集模型(Nested Set)

这种模型通过left和right值来表示层级关系,查询效率高但维护复杂。

CREATE TABLE categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    lft INT NOT NULL,
    rgt INT NOT NULL
);
// 获取整个树
function getFullTree() {
    $query = "SELECT * FROM categories ORDER BY lft";
    $result = mysqli_query($connection, $query);

    $tree = [];
    $stack = [];

    while ($row = mysqli_fetch_assoc($result)) {
        $node = $row;
        $node['children'] = [];

        while (!empty($stack) && $stack[count($stack)-1]['rgt'] < $node['rgt']) {
            array_pop($stack);
        }

        if (!empty($stack)) {
            $stack[count($stack)-1]['children'][] = &$node;
        } else {
            $tree[] = &$node;
        }

        $stack[] = &$node;
    }

    return $tree;
}

路径枚举(Path Enumeration)

存储从根到当前节点的完整路径。

CREATE TABLE categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    path VARCHAR(255) NOT NULL
);
// 获取子分类
function getChildren($path) {
    $query = "SELECT * FROM categories WHERE path LIKE '" . mysqli_real_escape_string($connection, $path) . "%'";
    $result = mysqli_query($connection, $query);

    $categories = [];
    while ($row = mysqli_fetch_assoc($result)) {
        $categories[] = $row;
    }

    return $categories;
}

闭包表(Closure Table)

使用单独的表存储节点之间的关系。

php 实现无限分类

CREATE TABLE categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) 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 getSubtree($categoryId) {
    $query = "SELECT c.* FROM categories c
              JOIN category_relations cr ON c.id = cr.descendant
              WHERE cr.ancestor = " . (int)$categoryId . "
              ORDER BY cr.depth";

    $result = mysqli_query($connection, $query);

    $tree = [];
    while ($row = mysqli_fetch_assoc($result)) {
        $tree[] = $row;
    }

    return $tree;
}

性能考虑

邻接列表简单但递归查询性能差;嵌套集查询高效但写操作复杂;路径枚举适合频繁读取场景;闭包表最灵活但占用空间大。根据实际需求选择合适方案。

标签: php
分享给朋友:

相关文章

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常用…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php底层实现

php底层实现

PHP底层实现的核心机制 PHP是一种解释型脚本语言,其底层实现涉及多个关键组件协同工作。理解这些机制有助于优化代码性能和深度调试。 Zend引擎架构 Zend引擎是PHP的核心执行器,采用编译器与…

php发帖实现

php发帖实现

PHP 发帖实现方法 数据库准备 创建一个数据库表用于存储帖子信息,常见的字段包括帖子ID、标题、内容、作者、发布时间等。SQL示例: CREATE TABLE posts ( id INT…

php实现区块链

php实现区块链

PHP 实现区块链的基本步骤 PHP 可以用于实现一个简单的区块链系统,以下是关键步骤和代码示例: 区块类实现 创建一个 Block 类来表示区块链中的单个区块: class Block {…