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;
}
迭代方法实现无限分类
迭代方法通过循环处理数据,避免递归可能导致的性能问题。
function getTree($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;
}
数据库表设计
实现无限分类需要合理的数据库表结构。通常包含以下字段:

CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '分类名称',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级ID',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分类表';
使用闭包表实现无限分类
闭包表是一种更高效的无限分类实现方式,通过额外的关系表存储节点之间的关系。
CREATE TABLE `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `category_closure` (
`ancestor` int(11) NOT NULL,
`descendant` int(11) NOT NULL,
`depth` int(11) NOT NULL,
PRIMARY KEY (`ancestor`,`descendant`)
);
使用预排序遍历树算法(MPTT)
MPTT算法通过左右值编码实现高效查询,适合读取频繁的场景。
class MPTT {
private $left = 'lft';
private $right = 'rgt';
public function rebuildTree($root = 0, $left = 1) {
$right = $left + 1;
$result = $this->getChildren($root);
foreach ($result as $row) {
$right = $this->rebuildTree($row['id'], $right);
}
$this->updateNode($root, $left, $right);
return $right + 1;
}
}
以上方法各有优缺点,递归方法简单但性能较差,迭代方法性能较好但代码稍复杂,闭包表和MPTT适合大型项目但实现难度较高。根据项目需求选择合适的方法。






