当前位置:首页 > PHP

php 无限分类的实现

2026-01-14 13:33:45PHP

无限分类的实现方法

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

邻接列表模型(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 = [];
    $result = mysqli_query($conn, "SELECT * FROM categories WHERE parent_id = $parentId");
    while ($row = mysqli_fetch_assoc($result)) {
        $row['children'] = getChildren($row['id']);
        $categories[] = $row;
    }
    return $categories;
}

嵌套集模型(Nested Set)

嵌套集模型通过left和right值来表示节点在树中的位置,查询效率高但更新复杂。

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

查询子树:

SELECT node.* 
FROM categories AS node, categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.id = 1
ORDER BY node.lft;

路径枚举(Path Enumeration)

通过存储从根节点到当前节点的完整路径来实现。

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

查询子节点:

SELECT * FROM categories WHERE path LIKE '1/2/%';

闭包表(Closure Table)

使用单独的关联表存储节点之间的关系,是最灵活的实现方式。

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

CREATE TABLE category_closure (
    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)
);

查询所有后代节点:

php 无限分类的实现

SELECT c.* 
FROM categories c
JOIN category_closure cc ON c.id = cc.descendant
WHERE cc.ancestor = 1 AND cc.descendant != 1;

性能比较

  • 邻接列表:简单易用,但递归查询性能较差
  • 嵌套集:查询性能好,但更新操作复杂
  • 路径枚举:简单,但依赖字符串操作
  • 闭包表:最灵活,查询和更新都方便,但需要额外表

实际应用建议

对于中小型项目,邻接列表或路径枚举足够简单实用。大型项目建议使用闭包表或嵌套集模型。现代框架如Laravel的Eloquent已内置对树形结构的支持,可简化开发。

标签: php
分享给朋友:

相关文章

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php 实现面包屑导航

php 实现面包屑导航

实现面包屑导航的方法 面包屑导航(Breadcrumb Navigation)是一种常见的网站导航方式,用于显示用户当前页面的路径。以下是几种在 PHP 中实现面包屑导航的方法。 基于 URL 路径…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…

php session 实现购物车

php session 实现购物车

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