if (!function_exists('pr')) {
/**
* 测试用打印函数
* @param array $arr
*/
function pr($arr)
{
if ($arr) {
echo '<pre>';
print_r($arr);
echo '</pre>';
} else {
echo 'pr数组为空!';
}
}
}
将要转化的数组
$arr = [
['id'=>1,'pid'=>0,'name'=>'a'],
['id'=>2,'pid'=>1,'name'=>'b'],
['id'=>3,'pid'=>1,'name'=>'c'],
['id'=>4,'pid'=>2,'name'=>'d'],
['id'=>5,'pid'=>2,'name'=>'e'],
['id'=>6,'pid'=>3,'name'=>'f'],
['id'=>7,'pid'=>3,'name'=>'g'],
];
代码:
function list_to_tree($list) {
$tree = array();// 创建Tree
if(is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$refer[$data['id']] = &$list[$key];
}
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data['pid'];
if (0 == $parentId) {
$tree = &$list[$key];
}else{
if (isset($refer[$parentId])) {
$parent = &$refer[$parentId];
$parent['children'][] = &$list[$key];
}
}
}
}
return $tree;
}
$tree = list_to_tree($arr);
到这一步就可以了,但是今天遇见一家公司的面试题,要求去除所有 pid,所以自己有进一步做了一件事情
function jPid(&$tree){
unset($tree['pid']);
if(isset($tree['children'])){
foreach($tree['children'] as $k=>$v){
jPid($tree['children'][$k]);
}
}
return $tree;
}
$tree = jPid($tree);
pr($tree);
输出
Array
(
[id] => 1
[name] => a
[children] => Array
(
[0] => Array
(
[id] => 2
[name] => b
[children] => Array
(
[0] => Array
(
[id] => 4
[name] => d
)
[1] => Array
(
[id] => 5
[name] => e
)
)
)
[1] => Array
(
[id] => 3
[name] => c
[children] => Array
(
[0] => Array
(
[id] => 6
[name] => f
)
[1] => Array
(
[id] => 7
[name] => g
)
)
)
)
)
转化为 json 输出
{
"id": 1,
"name": "a",
"children": [
{
"id": 2,
"name": "b",
"children": [
{
"id": 4,
"name": "d"
},
{
"id": 5,
"name": "e"
}
]
},
{
"id": 3,
"name": "c",
"children": [
{
"id": 6,
"name": "f"
},
{
"id": 7,
"name": "g"
}
]
}
]
}