当前位置:首页 > PHP

无限分类实现 php

2026-02-27 12:56:54PHP

无限分类的实现方法

无限分类通常用于组织结构化的层级数据,如商品分类、地区分类等。以下是几种常见的实现方式:

邻接表模型(Adjacency List)

邻接表是最简单的实现方式,通过在表中添加一个parent_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 getCategoryTree($parentId = 0, $level = 0) {
    $categories = [];
    $result = mysqli_query($conn, "SELECT * FROM categories WHERE parent_id = $parentId");

    while ($row = mysqli_fetch_assoc($result)) {
        $row['level'] = $level;
        $categories[] = $row;
        $categories = array_merge($categories, getCategoryTree($row['id'], $level + 1));
    }

    return $categories;
}

路径枚举法(Path Enumeration)

通过在表中添加一个path字段,存储从根节点到当前节点的完整路径。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    path VARCHAR(255) NOT NULL
);
// 添加分类
function addCategory($name, $parentId = 0) {
    if ($parentId == 0) {
        $path = '0';
    } else {
        $parent = mysqli_query($conn, "SELECT path FROM categories WHERE id = $parentId");
        $path = mysqli_fetch_assoc($parent)['path'] . ',' . $parentId;
    }

    mysqli_query($conn, "INSERT INTO categories (name, path) VALUES ('$name', '$path')");
}

嵌套集模型(Nested Set)

使用leftright值来表示节点在树中的位置,查询效率高但更新复杂。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    lft INT NOT NULL,
    rgt INT NOT NULL
);
// 获取分类树
function getCategoryTree($parentId = 0) {
    $result = mysqli_query($conn, "SELECT node.* FROM categories AS node, categories AS parent 
                                 WHERE node.lft BETWEEN parent.lft AND parent.rgt 
                                 AND parent.id = $parentId 
                                 ORDER BY node.lft");

    return mysqli_fetch_all($result, MYSQLI_ASSOC);
}

闭包表(Closure Table)

使用单独的关联表存储节点之间的关系,适合频繁查询的场景。

无限分类实现 php

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    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 addCategoryRelation($ancestor, $descendant, $depth) {
    mysqli_query($conn, "INSERT INTO category_relations (ancestor, descendant, depth) 
                        VALUES ($ancestor, $descendant, $depth)");
}

性能比较

  • 邻接表:简单易实现,但递归查询性能较差
  • 路径枚举:查询方便,但维护路径复杂
  • 嵌套集:查询高效,但插入和更新成本高
  • 闭包表:查询和维护都较方便,但需要额外存储空间

选择哪种实现方式取决于具体应用场景和性能需求。对于中小型项目,邻接表或路径枚举通常足够;对于大型项目,可能需要考虑嵌套集或闭包表。

标签: php
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php 实现接口

php 实现接口

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

php实现跳转

php实现跳转

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

php实现即时通讯

php实现即时通讯

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