当前位置:首页 > PHP

php无限分类的实现

2026-04-02 20:55:30PHP

无限分类的实现方法

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

递归方法实现

使用递归函数遍历分类树结构:

function getCategoryTree($parent_id = 0, $level = 0) {
    $categories = [];
    $result = db_query("SELECT * FROM categories WHERE parent_id = $parent_id");

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

    return $categories;
}

闭包表(Closure Table)设计

闭包表是一种高效的无限分类存储方案:

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

CREATE TABLE category_paths (
    ancestor INT,
    descendant INT,
    depth INT,
    PRIMARY KEY (ancestor, descendant)
);

查询所有子分类:

php无限分类的实现

function getDescendants($category_id) {
    $query = "SELECT c.* FROM categories c
              JOIN category_paths cp ON c.id = cp.descendant
              WHERE cp.ancestor = $category_id AND cp.depth > 0";
    return db_query($query);
}

预排序遍历树算法(MPTT)

MPTT通过左右值标记节点位置:

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

获取子树:

function getSubTree($node_id) {
    $node = db_query("SELECT lft, rgt FROM categories WHERE id = $node_id");
    $query = "SELECT * FROM categories 
              WHERE lft BETWEEN {$node['lft']} AND {$node['rgt']}
              ORDER BY lft";
    return db_query($query);
}

扁平化存储+路径枚举

使用path字段存储完整路径:

php无限分类的实现

CREATE TABLE categories (
    id INT PRIMARY KEY,
    name VARCHAR(255),
    path VARCHAR(255)  -- 如 '1,5,12' 表示1→5→12的路径
);

查询子分类:

function getChildren($category_id) {
    return db_query("SELECT * FROM categories WHERE path LIKE '%,$category_id,%'");
}

使用嵌套集合模型

嵌套集合模型与MPTT类似,但实现方式不同:

function rebuildTree($parent_id = 0, $left = 1) {
    $right = $left + 1;
    $result = db_query("SELECT id FROM categories WHERE parent_id = $parent_id");

    while ($row = db_fetch_array($result)) {
        $right = rebuildTree($row['id'], $right);
    }

    db_query("UPDATE categories SET lft = $left, rgt = $right WHERE id = $parent_id");
    return $right + 1;
}

选择哪种方法取决于具体需求:

  • 递归方法简单但效率较低
  • 闭包表和MPTT查询效率高但写操作复杂
  • 路径枚举简单直观但路径管理需要额外逻辑

实际应用中,闭包表或MPTT通常是最佳选择,特别是当分类层级较深且需要频繁查询时。

标签: php
分享给朋友:

相关文章

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php session 实现购物车

php session 实现购物车

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

php 实现路由

php 实现路由

PHP 实现路由的方法 在 PHP 中实现路由功能可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 PHP 实现简单路由 通过解析 URL 并匹配对应的处理逻辑,可以实现基本的路由功能。以…