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

PHP 迭代實現麵包屑導航:家譜樹向上查找 (非遞歸版)

     編輯:PHP 相關知識

PHP 迭代實現麵包屑導航:家譜樹向上查找 (非遞歸版)

遞歸雖直觀但受限於 PHP 預設 256 層遞歸深度。迭代版使用 while 迴圈配合 array_unshift 同樣能高效構建祖先路徑,且無深度限制。

資料結構 (同文章 142800)

$area = [
    ['id'=>1,   'area'=>'北京',   'pid'=>0],
    ['id'=>2,   'area'=>'廣西',   'pid'=>0],
    ['id'=>3,   'area'=>'廣東',   'pid'=>0],
    ['id'=>4,   'area'=>'福建',   'pid'=>0],
    ['id'=>11,  'area'=>'朝陽區', 'pid'=>1],
    ['id'=>12,  'area'=>'海澱區', 'pid'=>1],
    ['id'=>21,  'area'=>'南寧市', 'pid'=>2],
    ['id'=>45,  'area'=>'福州市', 'pid'=>4],
    ['id'=>113, 'area'=>'亞運村', 'pid'=>11],
    ['id'=>115, 'area'=>'奧運村', 'pid'=>11],
    ['id'=>234, 'area'=>'武鳴縣', 'pid'=>21],
];

迭代函數實作

<?php
function familyTreeIterative($arr, $id) {
    $list = [];
    while ($id) {
        $found = false;
        foreach ($arr as $v) {
            if ($v['id'] == $id) {
                array_unshift($list, $v['area']); // 头插法,保證根在前
                $id = $v['pid'];
                $found = true;
                break;
            }
        }
        if (!$found) break; // 找不到父節點,防止死循環
    }
    return $list;
}

$result = familyTreeIterative($area, 113);
print_r($result);

輸出結果

Array
(
    [0] => 北京
    [1] => 朝陽區
    [2] => 亞運村
)

關鍵技術點

  • array_unshift:每次將找到的節點插入陣列頭部,自然形成「根 → ... → 葉」順序,無需反轉。
  • while($id):當 pid=0 (根節點) 時循環結束。
  • 防死循環:$found 標記處理資料髒污 (如 pid 指向不存在節點、循環引用)。
  • 效能優化:大數據集建議預建立 [$id => $node] 映射,將 O(n) 查找降為 O(1)。

遞歸 vs 迭代 選型指南

維度遞歸迭代
代碼可讀性高 (符合樹遞歸定義)中
深度限制受限 (預設 256)無限制
記憶體佔用調用棧累積常數級
適用場景淺層樹、快速原型深層樹、高頻調用、長期運行服務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved