无限分类实现 php
无限分类的 PHP 实现方法
无限分类是一种常见的树形数据结构,常用于商品分类、菜单管理等场景。以下是几种常见的实现方式:
递归方法实现
递归是最直观的实现方式,通过函数自身调用来处理子分类:
function getTree($data, $pid = 0, $level = 0) {
static $tree = array();
foreach($data as $k => $v) {
if($v['pid'] == $pid) {
$v['level'] = $level;
$tree[] = $v;
getTree($data, $v['id'], $level+1);
}
}
return $tree;
}
数据库表结构通常包含:
- id: 分类ID
- pid: 父分类ID
- name: 分类名称
- 其他字段...
引用方法实现
通过引用方式可以避免递归的性能问题:

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;
}
闭包表实现
闭包表(Closure Table)是更专业的解决方案,需要额外的表存储节点关系:
CREATE TABLE category (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE category_closure (
ancestor INT,
descendant INT,
depth INT,
PRIMARY KEY (ancestor, descendant)
);
PHP查询示例:
function getDescendants($categoryId) {
// 查询所有后代
$sql = "SELECT c.* FROM category c
JOIN category_closure cc ON c.id = cc.descendant
WHERE cc.ancestor = ? AND cc.descendant != ?";
// 执行查询...
}
预排序遍历树算法
MPTT(Modified Preorder Tree Traversal)算法通过left和right值表示树结构:

CREATE TABLE category (
id INT PRIMARY KEY,
name VARCHAR(50),
lft INT,
rgt INT
);
PHP实现示例:
function getTree($rootId) {
$sql = "SELECT node.*, (COUNT(parent.id) - 1) AS depth
FROM category AS node,
category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.id
ORDER BY node.lft";
// 执行查询...
}
实际应用建议
对于中小型项目,引用方法实现简单高效。大型项目建议使用闭包表或MPTT,虽然实现复杂但查询效率更高。
分类数据展示时,可通过CSS缩进表现层级关系:
<ul>
<?php foreach($categories as $cat): ?>
<li style="padding-left: <?php echo $cat['level']*20?>px">
<?php echo $cat['name']?>
</li>
<?php endforeach; ?>
</ul>
每种方法各有优缺点,应根据项目规模、性能要求和开发复杂度选择合适的实现方案。






