当前位置:首页 > PHP

无限分类实现 php

2026-04-02 21:44:31PHP

无限分类的实现方法

无限分类是一种常见的树形结构数据存储方式,适用于商品分类、部门架构等场景。以下是几种常见的实现方式:

邻接表模型(Adjacency List)

邻接表是最简单的实现方式,通过在表中添加一个parent_id字段来建立层级关系。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    parent_id INT DEFAULT NULL,
    FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE CASCADE
);

查询某个分类的子分类:

function getChildren($parentId = 0) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("SELECT * FROM categories WHERE parent_id = ?");
    $stmt->execute([$parentId]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

路径枚举法(Path Enumeration)

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

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

查询某个节点的所有子节点:

function getChildren($nodeId) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("SELECT * FROM categories WHERE path LIKE ?");
    $stmt->execute(["%/$nodeId/%"]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

嵌套集模型(Nested Set)

使用leftright值来表示节点在树中的位置。

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

查询某个节点的所有子节点:

function getChildren($nodeId) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->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(PDO::FETCH_ASSOC);
}

闭包表(Closure Table)

使用单独的表存储节点之间的关系。

CREATE TABLE categories (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) 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 getChildren($nodeId) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("SELECT c.* FROM categories c JOIN category_relations cr ON c.id = cr.descendant WHERE cr.ancestor = ? AND cr.depth > 0");
    $stmt->execute([$nodeId]);
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

递归实现无限分类

使用递归函数获取所有子分类:

function getAllCategories($parentId = 0, $level = 0) {
    $db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
    $stmt = $db->prepare("SELECT * FROM categories WHERE parent_id = ?");
    $stmt->execute([$parentId]);
    $categories = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $result = [];
    foreach ($categories as $category) {
        $category['level'] = $level;
        $result[] = $category;
        $result = array_merge($result, getAllCategories($category['id'], $level + 1));
    }
    return $result;
}

无限分类的前端展示

在HTML中展示无限分类:

function displayCategories($categories, $parentId = 0, $level = 0) {
    echo '<ul>';
    foreach ($categories as $category) {
        if ($category['parent_id'] == $parentId) {
            echo '<li>' . $category['name'];
            displayCategories($categories, $category['id'], $level + 1);
            echo '</li>';
        }
    }
    echo '</ul>';
}

性能优化建议

对于大型分类系统,邻接表模型在查询性能上可能存在问题。嵌套集模型和闭包表在查询性能上更优,但更新操作更复杂。应根据具体需求选择合适的实现方式。

无限分类实现 php

可以使用缓存机制存储分类数据,减少数据库查询次数。对于不经常变动的分类数据,可以考虑生成静态HTML或使用Redis等缓存工具。

标签: php
分享给朋友:

相关文章

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php 实现登录

php 实现登录

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

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…

php 实现排名

php 实现排名

PHP 实现排名的方法 在 PHP 中实现排名功能通常涉及对数据进行排序、计算排名以及输出结果。以下是几种常见的实现方式: 基本数组排序排名 $scores = [85, 92, 78, 95, 8…