php 实现无限分类
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;
}
调用方式:
$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;
}
调用方式:
$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字段建立索引。







