当前位置:首页 > PHP

php 实现无限分类

2026-02-13 14:16:20PHP

PHP 实现无限分类的方法

递归方法实现无限分类

递归是一种常见的实现无限分类的方式,通过函数自身调用遍历所有子分类。

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

调用方式:

php 实现无限分类

$data = [
    ['id' => 1, 'pid' => 0, 'name' => '分类1'],
    ['id' => 2, 'pid' => 0, 'name' => '分类2'],
    ['id' => 3, 'pid' => 1, 'name' => '分类1-1'],
    ['id' => 4, 'pid' => 1, 'name' => '分类1-2'],
    ['id' => 5, 'pid' => 2, 'name' => '分类2-1'],
    ['id' => 6, 'pid' => 3, 'name' => '分类1-1-1']
];
$tree = getTree($data);

引用方法实现无限分类

引用方法通过修改原始数组的引用关系来构建树形结构,效率较高。

function generateTree($items) {
    $tree = array();
    foreach ($items as $item) {
        if (isset($items[$item['pid']])) {
            $items[$item['pid']]['children'][] = &$items[$item['id']];
        } else {
            $tree[] = &$items[$item['id']];
        }
    }
    return $tree;
}

调用方式:

php 实现无限分类

$items = array();
foreach ($data as $d) {
    $items[$d['id']] = $d;
}
$tree = generateTree($items);

数据库设计

无限分类通常采用以下数据库表结构:

CREATE TABLE `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级ID',
  `name` varchar(50) NOT NULL COMMENT '分类名称',
  `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

获取所有子分类ID

function getChildIds($id, $data) {
    $ids = array($id);
    foreach ($data as $v) {
        if ($v['pid'] == $id) {
            $ids = array_merge($ids, getChildIds($v['id'], $data));
        }
    }
    return $ids;
}

获取分类路径(面包屑导航)

function getPath($id, $data) {
    $path = array();
    foreach ($data as $v) {
        if ($v['id'] == $id) {
            $path[] = $v;
            $path = array_merge(getPath($v['pid'], $data), $path);
        }
    }
    return $path;
}

注意事项

递归方法在处理大量数据时可能出现性能问题,可以考虑使用缓存优化。引用方法在处理大数据时效率更高,但实现稍复杂。实际项目中应根据数据量大小和性能要求选择合适的实现方式。

数据库查询时可以使用WHERE pid=0获取顶级分类,使用WHERE pid=分类ID获取子分类。为提高查询效率,可以为pid字段建立索引。

标签: php
分享给朋友:

相关文章

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mod_…

php实现文章

php实现文章

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

php 链表实现

php 链表实现

在 PHP 中实现链表可以通过类来模拟链表节点(Node)和链表(LinkedList)结构。以下是链表的完整实现示例,包含基础操作如插入、删除、遍历等。 链表节点类(Node) 链表的基本单元是节…