当前位置:首页 > PHP

php 实现无限分类

2026-01-14 13:29:07PHP

无限分类的实现方法

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

邻接列表模型(Adjacency List)

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

php 实现无限分类

// 数据库表结构示例
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值来表示层级关系,查询效率高但维护复杂。

php 实现无限分类

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)

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

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 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现mvc

php实现mvc

PHP 实现 MVC 架构 MVC(Model-View-Controller)是一种常用的软件设计模式,将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller…

php实现发帖

php实现发帖

PHP 实现发帖功能 要在 PHP 中实现发帖功能,通常需要结合数据库操作(如 MySQL)和前端表单提交。以下是实现发帖功能的关键步骤: 数据库表设计 创建一个帖子表(posts)存储发帖内容,基…

php实现分享功能实现

php实现分享功能实现

实现PHP分享功能的方法 在PHP中实现分享功能可以通过多种方式完成,以下是一些常见的实现方法: 使用社交媒体分享按钮 社交媒体平台如Facebook、Twitter、LinkedIn等提供了现成…

php实现回复功能

php实现回复功能

实现回复功能的基本步骤 在PHP中实现回复功能通常涉及数据库操作、表单处理和前后端交互。以下是实现回复功能的关键步骤: 数据库设计 创建包含回复数据的表结构,例如: CREATE TABLE re…