P粉0434701582023-09-04 14:57:41
你比你想像的更接近。只需遞歸呼叫你的函數,並將結果加入最終數組。
public function flattingTree(array $tree) { $denormalizeTree = []; foreach ($tree as $node) { if (isset($node['nodes'])) { $denormalizeTree += $this->flattingTree($node['nodes']); } $denormalizeTree[$node['id']] = $node['text']; } return $denormalizeTree; }
結果:
$result = $this->flattingTree($array); print_r($result); Array ( [11] => Flowchart [12] => Pseudo code [2] => Algoritma [4] => Java [8] => Yii2 Framework [9] => Laravel [5] => PHP [7] => Javascript [3] => Pemrograman [13] => Mac OS [14] => Linux [10] => Sistem Operasi )
P粉8073979732023-09-04 13:40:19
一個快速的解決方案是使用遞歸函數遍歷數組並將所需資料加入最終數組。
關鍵在於有一個函數接受「未展開」的陣列和一個變數來保存資料(資料將保存在該變數中)。最後一個參數將透過引用傳遞,以便變數本身被改變,從而將資料保存在其中。
function extract($arr, &$saveInto) { foreach ($arr as $el) { isset($el['id'], $el['text']) && ($saveInto[$el['id']] = $el['text']); isset($el['nodes']) && extract($el['nodes'], $saveInto); // 递归调用 } }
使用上述函數,可以透過呼叫它並指定一個變數來展開陣列以保存結果。
$unflattenedArr = [ ... ]; // 要展开的数组 $finalArr = []; // 将保存结果的数组 extract($unflattenedArr, $finalArr); // 此时 $finalArr 中保存了所需的结果。
為了讓事情更簡單,可以封裝 extract
函數,不再需要準備一個空數組來保存結果。
function flatten($arr) { $r = []; // 此函数准备一个空变量 extract($arr, $r); // 将其传递给“extract”函数 return $r; // 然后返回带有所需结果的变量 }
現在,可以以下方式展開陣列:
$unflattenedArr = [ ... ]; // 要展开的数组 $finalArr = flatten($unflattenedArr); // 调用封装了“extract”函数的新函数 // 此时 $finalArr 中保存了所需的结果。
希望我已經幫助你進一步了。