当前位置:首页 > 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;
}

数据库设计

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

php 无限分类的实现

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);
}

闭包表

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

php 无限分类的实现

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 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…