给定节点 ID,从扁平数组中向上追溯至根节点,生成面包屑数组 ['北京','朝阳区','亚运村']。迭代法避免递归栈溢出,代码更简洁。
<?php
$areas = [
['id'=>1, 'name'=>'北京', 'pid'=>0],
['id'=>11, 'name'=>'朝阳区', 'pid'=>1],
['id'=>113,'name'=>'亚运村', 'pid'=>11],
// ...
];
?>
<?php
function familyTreeIterative(array $data, int $id): array {
$path = [];
while ($id) {
$found = false;
foreach ($data as $node) {
if ($node['id'] == $id) {
array_unshift($path, $node['name']); // 头部插入,保持从根到叶顺序
$id = $node['pid'];
$found = true;
break;
}
}
if (!$found) break; // 防御:pid 指向不存在节点
}
return $path;
}
print_r(familyTreeIterative($areas, 113));
/*
Array
(
[0] => 北京
[1] => 朝阳区
[2] => 亚运村
)
*/
?>
<?php
$map = array_column($areas, null, 'id'); // 键为 id,值为整行
function familyTreeFast(array $map, int $id): array {
$path = [];
while ($id && isset($map[$id])) {
array_unshift($path, $map[$id]['name']);
$id = $map[$id]['pid'];
}
return $path;
}
?>
从 O(n²) 降为 O(h)(h=树高),大数据量极其关键。