PHP 陣列轉化成樹
阿新 • • 發佈:2018-11-29
使用棧的思想實現陣列到樹的轉化
時間複雜度O(n)
空間複雜度O(n)
/** * $list 陣列轉化成森林 * $pk key * $pid parentId * */ function arrayToForest($list, $pk, $pid, $child = 'children') { $tree = array(); if (!is_array($list)) { return $tree; } $refer = array(); $parentNodeIdArr = []; foreach ($list as $key => $data) { $refer[$data[$pk]] = &$list[$key]; $parentNodeIdArr[$data[$pid]] = $data[$pid]; } /* 尋找根結點 */ foreach ($list as $key => $data) { if (in_array($data[$pk], $parentNodeIdArr)) { unset($parentNodeIdArr[$data[$pk]]); } } foreach ($list as $key => $data) { $parantId = $data[$pid]; if (in_array($parantId, $parentNodeIdArr)) { $tree[] = &$list[$key]; } else { if (isset($refer[$parantId])) { $parent = &$refer[$parantId]; $parent[$child][] = &$list[$key]; } } } return $tree; }
測試資料:
$list = [ ['id' => 6, 'pid' => 0], ['id' => 1, 'pid' => 0], ['id' => 2, 'pid' => 1], ['id' => 3, 'pid' => 2], ['id' => 4, 'pid' => 1], ['id' => 5, 'pid' => 2], ]; $tree = arrayToForest($list, 'id', 'pid', 'children'); print_r($tree);die;
測試結果:
Array ( [0] => Array ( [id] => 6 [pid] => 0 ) [1] => Array ( [id] => 1 [pid] => 0 [children] => Array ( [0] => Array ( [id] => 2 [pid] => 1 [children] => Array ( [0] => Array ( [id] => 3 [pid] => 2 ) [1] => Array ( [id] => 5 [pid] => 2 ) ) ) [1] => Array ( [id] => 4 [pid] => 1 ) ) ) )