php无限分类的实现
PHP无限分类的实现
无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法:
递归实现法
递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据库表结构通常包含id、name、parent_id字段:
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
parent_id INT DEFAULT 0
);
递归查询代码示例:
function getTree($parentId = 0, $level = 0) {
$tree = [];
$result = mysqli_query($conn, "SELECT * FROM categories WHERE parent_id = $parentId");
while ($row = mysqli_fetch_assoc($result)) {
$row['level'] = $level;
$tree[] = $row;
$tree = array_merge($tree, getTree($row['id'], $level + 1));
}
return $tree;
}
闭包表(Closure Table)实现
闭包表通过额外的关系表存储节点间的所有路径关系,适合频繁查询的场景:
CREATE TABLE category_closure (
ancestor INT NOT NULL,
descendant INT NOT NULL,
depth INT NOT NULL,
PRIMARY KEY (ancestor, descendant)
);
查询所有子节点:
$query = "SELECT c.* FROM categories c
JOIN category_closure cc ON c.id = cc.descendant
WHERE cc.ancestor = $parentId";
嵌套集模型(Nested Set)
嵌套集通过left和right值表示节点在树中的位置:
ALTER TABLE categories ADD COLUMN lft INT, ADD COLUMN rgt INT;
查询子树:
$query = "SELECT node.* FROM categories node, categories parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.id = $parentId
ORDER BY node.lft";
路径枚举法(Path Enumeration)
通过存储完整路径字符串实现,如1/4/7表示节点7的路径:
ALTER TABLE categories ADD COLUMN path VARCHAR(255);
查询子节点:
$query = "SELECT * FROM categories WHERE path LIKE '$parentPath/%'";
每种方法各有优劣:
- 递归实现简单但效率较低
- 闭包表查询高效但写入复杂
- 嵌套集适合读取频繁场景
- 路径枚举直观但移动节点成本高
实际选择应根据项目具体需求决定。






