PHP 多维数组转为树结构

在项目中我们会遇到获取存在父子级关系的数组,并需要根据上下级关系以树结构的形式展示的情况

比如获取分类列表,类似如下数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$data = [
['id'=>13, 'name'=>'分类2-2-2', 'pid'=>9],
['id'=>1, 'name'=>'分类1', 'pid'=>0],
['id'=>2, 'name'=>'分类1-1', 'pid'=>1],
['id'=>3, 'name'=>'分类1-2', 'pid'=>1],
['id'=>4, 'name'=>'分类1-1-1', 'pid'=>2],
['id'=>5, 'name'=>'分类1-1-2', 'pid'=>2],
['id'=>6, 'name'=>'分类1-2-1', 'pid'=>3],
['id'=>7, 'name'=>'分类2', 'pid'=>0],
['id'=>8, 'name'=>'分类2-1', 'pid'=>7],
['id'=>9, 'name'=>'分类2-2', 'pid'=>7],
['id'=>10, 'name'=>'分类2-1-1', 'pid'=>8],
['id'=>11, 'name'=>'分类2-1-2', 'pid'=>8],
['id'=>12, 'name'=>'分类2-2-1', 'pid'=>9],
];

实现方法代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* 将返回的数据集转换成树
* @param array $list 数据集
* @param string $pk 主键
* @param string $pid 父节点名称
* @param string $child 子节点名称
* @param integer $root 根节点ID
* @return array 转换后的树
*/
function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'child', $root=0) {
$tree = array();// 创建Tree
if(is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $index => $data) {
/*基于主键的新数组与之前的数组地址一样,修改其中一个数组的数据另一个也会变*/
$refer[$data[$pk]] =& $list[$index];
}

foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data[$pid];
if ($root == $parentId) {
$tree[$data[$pk]] =& $list[$key];
} else {
if (isset($refer[$parentId])) {
$parent =& $refer[$parentId];
$parent[$child][] =& $list[$key];
}
}
}
}

return $tree;
}

echo '<pre>';var_dump(list_to_tree($data));

主要思路概况是,把要遍历的数组,创建基于主键的数组引用。把要生成的树结构数组也数组引用

比如案例中的 $refer[13] === $list[0],$tree[13] === $refer[13],利用了多个变量指向同地址,其中一个参数改变了数据,另外的参数数据也会改变。

坚持原创技术分享,您的支持将鼓励我继续创作!
0%