常見需求:從扁平資料(如 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.2.1 → ['1','2','1'] 代表層級路徑。&$res 與 &$ptr[$segment]['child'] 確保操作的是同一記憶體位址,避免陣列複製。!isset($ptr[$segment]) 檢查並建立缺失層級。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;
}
1001.02.05)掌握「引用指標 + 路徑分段」模式,扁平轉樹狀不再是難題。