首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 面包屑导航:迭代法查找祖先链路(无递归、无静态变量)

     編輯:PHP 綜合知識

场景

给定节点 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] => 亚运村
)
*/
?>

性能优化:建立 ID 索引

<?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=树高),大数据量极其关键。

对比:递归版(见 60507)

  • 递归:代码短,但需静态变量/引用传递收集结果,深层级有栈溢出风险
  • 迭代:显式控制循环,内存恒定,配合索引数组性能最优
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved