利用 PHP 陣列元素為引用的特性,一次遍歷即可構建樹結構:將每個節點按 pid 掛載到父節點的 son 屬性下,根節點(pid=0)收集為最終結果。時間複雜度 O(n),避免傳統遞歸查找的 O(n²) 性能問題。
function generateTree($items) {
$tree = [];
foreach ($items as $item) {
if (isset($items[$item['pid']])) {
$items[$item['pid']]['son'][] = &$items[$item['id']]; // 引用賦值
} else {
$tree[] = &$items[$item['id']];
}
}
return $tree;
}
// 測試數據
$items = [
1 => ['id'=>1,'pid'=>0,'name'=>'安徽省'],
2 => ['id'=>2,'pid'=>0,'name'=>'浙江省'],
3 => ['id'=>3,'pid'=>1,'name'=>'合肥市'],
4 => ['id'=>4,'pid'=>3,'name'=>'長豐縣'],
5 => ['id'=>5,'pid'=>1,'name'=>'安慶市'],
];
print_r(generateTree($items));
function generateTree($items) {
foreach ($items as $item)
$items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];
return isset($items[0]['son']) ? $items[0]['son'] : [];
}
生成樹結構後,仍需遞歸遍歷輸出:
$tree = generateTree($items);
function getTreeData($tree) {
foreach ($tree as $t) {
echo $t['name'] . '<br>';
if (isset($t['son'])) getTreeData($t['son']);
}
}
getTreeData($tree);