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

PHP 無限級分類樹形結構生成:引用賦值的高效算法與遞歸輸出

     編輯:PHP 綜合知識

算法核心思想

利用 PHP 陣列元素為引用的特性,一次遍歷即可構建樹結構:將每個節點按 pid 掛載到父節點的 son 屬性下,根節點(pid=0)收集為最終結果。時間複雜度 O(n),避免傳統遞歸查找的 O(n²) 性能問題。

標準版 generateTree

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));

極簡版(5 行)

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);

適用場景與限制

  • 適用於「父節點 ID 小於子節點」或無序但需一次性構建樹的場景。
  • 若數據量極大(百萬級),陣列引用可能佔用較多內存,可考慮生成器或分批處理。
  • 輸出前端樹形組件時,通常仍需遞歸或棧模擬遞歸序列化為 JSON。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved