使用栈的思想实现数组到树的转化
时间复杂度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
)
)
)
)