当前位置:首页 > 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 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…

php session 实现购物车

php session 实现购物车

PHP Session 实现购物车的方法 初始化 Session 在 PHP 脚本的最开始调用 session_start() 函数,确保会话已启用。这通常在页面的顶部完成。 session_sta…

排序算法 php实现

排序算法 php实现

以下是用PHP实现的常见排序算法,每种算法均附示例代码和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置实现排序: function bubbleSort($arr) { $n = c…

php实现单例模式

php实现单例模式

单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于数据库连接、日志记录器等需要全局唯一实例的场景。 PHP实现单例模式的关键步骤 私有化构造函…