当前位置:首页 > PHP

无限分类实现 php

2026-01-14 13:27:22PHP

无限分类的实现方法

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

邻接列表模式(Adjacency List)

邻接列表是最简单的实现方式,通过在每个记录中存储父级ID来建立层级关系。

// 数据库表结构示例
CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    parent_id INT DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE CASCADE
);

查询子分类的递归方法:

function getChildren($parentId = 0) {
    $categories = [];
    $stmt = $pdo->prepare("SELECT * FROM categories WHERE parent_id = ?");
    $stmt->execute([$parentId]);

    while ($row = $stmt->fetch()) {
        $row['children'] = getChildren($row['id']);
        $categories[] = $row;
    }

    return $categories;
}

路径枚举模式(Path Enumeration)

在记录中存储从根节点到当前节点的完整路径。

无限分类实现 php

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

查询子分类:

function getChildren($path) {
    $stmt = $pdo->prepare("SELECT * FROM categories WHERE path LIKE ? ORDER BY path");
    $stmt->execute([$path . '%']);
    return $stmt->fetchAll();
}

嵌套集模式(Nested Set)

使用左右值表示层级关系,查询效率高但更新复杂。

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

查询子树:

无限分类实现 php

function getSubTree($nodeId) {
    $stmt = $pdo->prepare("SELECT node.* FROM categories AS node, 
                          categories AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt 
                          AND parent.id = ? ORDER BY node.lft");
    $stmt->execute([$nodeId]);
    return $stmt->fetchAll();
}

闭包表模式(Closure Table)

使用单独的关系表存储节点间的所有路径。

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

CREATE TABLE category_paths (
    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 getDescendants($categoryId) {
    $stmt = $pdo->prepare("SELECT c.* FROM categories c 
                          JOIN category_paths cp ON c.id = cp.descendant
                          WHERE cp.ancestor = ?");
    $stmt->execute([$categoryId]);
    return $stmt->fetchAll();
}

性能比较

邻接列表:实现简单,但递归查询性能较差 路径枚举:查询简单,但路径维护复杂 嵌套集:查询高效,但更新操作复杂 闭包表:灵活性高,但需要额外存储空间

选择哪种实现方式取决于具体的应用场景和性能需求。对于中小型项目,邻接列表通常足够使用;对于大型复杂项目,闭包表或嵌套集可能更合适。

标签: php
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php实现搜索功能

php实现搜索功能

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

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现树

php实现树

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

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n!…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE o…