PHP二维数组生成树形结构

发布于:2023-01-04 ⋅ 阅读:(845) ⋅ 点赞:(0)

https://zhuanlan.zhihu.com/p/127102866
看了这篇文章所受影响

方式一,不使用递归的方式实现

//#假定的一个数据
$data=array(
    array("id"=>2,"pid"=>1),
    array("id"=>3,"pid"=>1),
    array("id"=>4,"pid"=>2),
    array("id"=>5,"pid"=>2),
    array("id"=>6,"pid"=>3),
    array("id"=>7,"pid"=>3),
    array("id"=>1,"pid"=>0),
);
$refer=array();//存储主键与数组单元的引用关系
//遍历让所有的键值都为其id
foreach($data as $k=>$v){
    $refer[$v['id']]=&$data[$k];//为每个数组成员建立对应关系
}
//遍历2
foreach($data as $k=>$v){
        $parent=&$refer[$v['pid']];//获取父分类的引用,这一步很重要,要传递地址
        $parent['child'][]=&$data[$k];//在父分类的childrn中再添加一个引用成员(php中&+变量名可以实现地址传递),这样做就可以监听到子代的变化,例如id为1的父亲有id为2,3的子代,而当id为2,3里面的子代发生改变后id为1的子代2,3因为地址传递的原因也会监听到变化,下方结果图可以查看得出的结果
}
print_r($data);
//注意本结果还要过滤下
$rs = array();
foreach($data as $value){
	//组装好的数据其实是全部,就是无论是否是子节点的数组,如下图所示,需要过滤下
	if($value["pid"]==0){
		$rs[] = $value;//只将顶级节点项装入
	}
}	

结果

方式二

我是看了这位大佬的博客才懂的,自己写了个递归但是太复杂了
https://blog.csdn.net/qq_36999656/article/details/109467553

//改进过的代码
//还是刚才的数据
$data=array(
    array("id"=>2,"pid"=>1),
    array("id"=>3,"pid"=>1),
    array("id"=>4,"pid"=>2),
    array("id"=>5,"pid"=>2),
    array("id"=>6,"pid"=>3),
    array("id"=>7,"pid"=>3),
    array("id"=>1,"pid"=>0),
);
public function getTree($data, $pId = 0)
{
    $tree = [];
    foreach($data as $k => $v)
    {
        if($v['pid'] == $pId)
        {
            // 子元素放到父级
            $v['children'] = getTree($data, $v['id']);
            $tree[] = $v;
        }
    }
    return $tree;
}
getTree($data);
//首次放入0就是为了先查找顶级节点

//描述下具体执行的情况:
//第一步其实只有id为1的才会通过 if($v['pid'] == $pId)
//然后让id为1的项添加一个键名为childern的项,他的值就是getTree()函数的返回值,这时递归调用getTree函数传入的值$data不变,$v["id"]为1,之后递归这时$pid为1,就可以找出所有以1为父级id的子项,就例如id为2的项,然后id为2的项又继续id为1时的套路去递归,直到把所有子孙组装好再返回结构,不得不说这样很巧妙。

//这种思想是控制每次传入的父节点id来实现子节点的查找,再通过递归加函数返回的方式把每次查询的子节点返回给当前父节点。

网站公告

今日签到

点亮在社区的每一天
去签到