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

PHP 扁平陣列轉多維樹狀結構

     編輯:PHP 綜合知識

問題背景

常見需求:從扁平資料(如 1=項目, 1.1=子項目, 1.1.1=孫項目)轉換為巢狀多維陣列,用於選單、分類樹、檔案目錄等場景。

資料格式範例

1 = 光電滑鼠
2 = 機械滑鼠
3 = 沒有滑鼠
1.1 = 黑色光電滑鼠
1.2 = 紅色光電滑鼠
1.2.1 = 藍牙紅色光電滑鼠

核心演算法:引用賦值法

<?php
$s = << $txt, 'child' => []];
        }
        $ptr = &$ptr[$segment]['child'];  // 移動指標到子層
    }
}

print_r($res);

輸出結果

Array
(
    [1] => Array
        (
            [txt] => 光電滑鼠
            [child] => Array
                (
                    [1] => Array
                        (
                            [txt] => 黑色光電滑鼠
                            [child] => Array()
                        )
                    [2] => Array
                        (
                            [txt] => 紅色光電滑鼠
                            [child] => Array
                                (
                                    [1] => Array
                                        (
                                            [txt] => 藍牙紅色光電滑鼠
                                            [child] => Array()
                                        )
                                )
                        )
                )
        )
    [2] => Array([txt] => 機械滑鼠, [child] => Array())
    [3] => Array([txt] => 沒有滑鼠, [child] => Array())
)

演算法核心解析

  1. 路徑分段:1.2.1 → ['1','2','1'] 代表層級路徑。
  2. 引用指標($ptr):&$res 與 &$ptr[$segment]['child'] 確保操作的是同一記憶體位址,避免陣列複製。
  3. 自動建節點:!isset($ptr[$segment]) 檢查並建立缺失層級。
  4. 單次遍歷:時間複雜度 O(N × 平均深度),極高效。

擴展:支援任意分隔符與屬性

function buildTree(array $flat, string $delimiter = '.', array $extraFields = []): array {
    $tree = [];
    foreach ($flat as $key => $val) {
        $path = explode($delimiter, $key);
        $ptr = &$tree;
        foreach ($path as $seg) {
            if (!isset($ptr[$seg])) {
                $node = ['key' => $seg, 'value' => $val, 'children' => []];
                foreach ($extraFields as $f) $node[$f] = $val[$f] ?? null;
                $ptr[$seg] = $node;
            }
            $ptr = &$ptr[$seg]['children'];
        }
    }
    return $tree;
}

應用場景

  • 無限級分類選單(後台管理、前端導航)
  • 檔案系統路徑重組
  • 組織架構圖(員工 ID 如 1001.02.05)
  • BOM 物料清單多層級展開

掌握「引用指標 + 路徑分段」模式,扁平轉樹狀不再是難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved