php实现树
PHP 实现树结构
在 PHP 中实现树结构可以通过多种方式完成,常见的方法包括使用数组、对象或数据库存储。以下是几种常见的实现方式:
使用多维数组
多维数组是最简单的方式来表示树结构,适用于小型或静态树。
$tree = [
'name' => 'Root',
'children' => [
[
'name' => 'Child 1',
'children' => [
['name' => 'Subchild 1'],
['name' => 'Subchild 2']
]
],
[
'name' => 'Child 2',
'children' => []
]
]
];
使用类和对象
通过面向对象的方式可以更灵活地操作树结构。
class TreeNode {
public $value;
public $children = [];
public function __construct($value) {
$this->value = $value;
}
public function addChild(TreeNode $child) {
$this->children[] = $child;
}
}
// 使用示例
$root = new TreeNode('Root');
$child1 = new TreeNode('Child 1');
$child2 = new TreeNode('Child 2');
$root->addChild($child1);
$root->addChild($child2);
使用嵌套集合模型(Nested Set Model)
嵌套集合模型适合数据库存储,查询效率高,但插入和删除操作较复杂。
// 数据库表结构示例
CREATE TABLE tree_nodes (
id INT PRIMARY KEY,
name VARCHAR(100),
lft INT,
rgt INT
);
// 查询子树
$query = "SELECT * FROM tree_nodes WHERE lft > :parent_lft AND rgt < :parent_rgt ORDER BY lft";
使用闭包表(Closure Table)
闭包表通过存储节点间的关系来实现树结构,适合频繁变化的树。
// 数据库表结构示例
CREATE TABLE nodes (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE node_relations (
ancestor INT,
descendant INT,
depth INT,
PRIMARY KEY (ancestor, descendant)
);
// 查询子树
$query = "SELECT n.* FROM nodes n JOIN node_relations r ON n.id = r.descendant WHERE r.ancestor = :node_id";
递归遍历树
递归是遍历树结构的常用方法。
function traverseTree(TreeNode $node, $level = 0) {
echo str_repeat(' ', $level) . $node->value . "\n";
foreach ($node->children as $child) {
traverseTree($child, $level + 1);
}
}
// 使用示例
traverseTree($root);
迭代遍历树
使用栈或队列可以实现非递归的树遍历。

function iterativeTraverse(TreeNode $root) {
$stack = [$root];
while (!empty($stack)) {
$node = array_pop($stack);
echo $node->value . "\n";
foreach (array_reverse($node->children) as $child) {
$stack[] = $child;
}
}
}
// 使用示例
iterativeTraverse($root);
总结
- 多维数组适合简单、静态的树结构。
- 类和对象提供了更好的灵活性和封装性。
- 嵌套集合模型和闭包表适合数据库存储和高效查询。
- 递归和迭代是遍历树结构的常用方法。






