当前位置:首页 > PHP

php 无限分类的实现

2026-02-27 13:02:46PHP

无限分类的实现方法

递归方法

递归是处理无限分类的常见方法。通过递归函数可以遍历所有子分类。

function getTree($data, $pid = 0, $level = 0) {
    static $tree = array();
    foreach ($data as $key => $value) {
        if ($value['pid'] == $pid) {
            $value['level'] = $level;
            $tree[] = $value;
            getTree($data, $value['id'], $level + 1);
        }
    }
    return $tree;
}

引用方法

使用引用方式构建树形结构,效率较高。

function makeTree($list) {
    $tree = array();
    $refer = array();

    foreach ($list as $key => $data) {
        $refer[$data['id']] = &$list[$key];
    }

    foreach ($list as $key => $data) {
        $parentId = $data['pid'];
        if ($parentId == 0) {
            $tree[] = &$list[$key];
        } else {
            if (isset($refer[$parentId])) {
                $parent = &$refer[$parentId];
                $parent['children'][] = &$list[$key];
            }
        }
    }
    return $tree;
}

数据库设计

无限分类需要合理的数据库表结构设计。

CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `pid` int(11) NOT NULL DEFAULT '0',
  `path` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

路径枚举法

使用path字段存储完整路径,如"1,2,5"表示其父级路径。

function getPath($id) {
    $path = array();
    while ($id > 0) {
        $category = getCategoryById($id); // 假设有此函数
        array_unshift($path, $category['id']);
        $id = $category['pid'];
    }
    return implode(',', $path);
}

闭包表

使用额外的关系表存储节点间关系,适合复杂查询。

CREATE TABLE `category_closure` (
  `ancestor` int(11) NOT NULL,
  `descendant` int(11) NOT NULL,
  `depth` int(11) NOT NULL,
  PRIMARY KEY (`ancestor`,`descendant`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

前端展示

将分类树转换为HTML结构。

function renderTree($tree) {
    $html = '<ul>';
    foreach ($tree as $node) {
        $html .= '<li>'.$node['name'];
        if (!empty($node['children'])) {
            $html .= renderTree($node['children']);
        }
        $html .= '</li>';
    }
    $html .= '</ul>';
    return $html;
}

性能优化

对于大数据量分类,建议使用缓存。

function getCachedTree() {
    $cacheKey = 'category_tree';
    if (!$tree = Cache::get($cacheKey)) {
        $list = Category::all()->toArray();
        $tree = makeTree($list);
        Cache::put($cacheKey, $tree, 1440);
    }
    return $tree;
}

php 无限分类的实现

标签: php
分享给朋友:

相关文章

php实现购物车

php实现购物车

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

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $imag…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebS…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数…