最新做的工作当中有个任务是要做一个微信分享链路跟踪,效果图如下图所示:
为了实现这个工作任务学习进步了不少,特此记录一下,这里使用的是引用方式实现的代码,
需要使用的分析数据结构如图:
常用的递归算法如下:
1.使用循环,分别获取所有的根节点。
2.在获取每个节点的时候,将该节点从原数据中移除,并递归方式获取其所有的子节点,一直原数据为空。
方法1:
如果使用递归函数的方式实现代码如下:
function make_tree1($list,$pk='id',$pid='pid',$child='_child',$root=0){ $tree=array(); foreach($list as $key=> $val){ if($val[$pid]==$root){ //获取当前$pid所有子类 unset($list[$key]); if(! empty($list)){ $child=make_tree1($list,$pk,$pid,$child,$val[$pk]); if(!empty($child)){ $val['_child']=$child; } } $tree[]=$val; } } return $tree; }
方法2
递归对资源的消耗是非常大的,实际执行起来效率也很低,所以有了下面的通过引用算法
实现的思路如下:
1,这一段应该是很通俗的,就是构建一个新的数组,新数组的key值是自己的主键id值
$items = array();
foreach($data as $v){
$items[$v['auth_id']] = $v;
}
这一段应该是很通俗的,就是构建一个新的数组,新数组的key值是自己的主键id值
进行完这一步之后,应该得到的数组形式是这样额
Array
(
[100] => Array
(
[auth_id] => 100
[auth_name] => 后台首页
[auth_pid] => 0
)
[116] => Array
(
[auth_id] => 116
[auth_name] => 管理员
[auth_pid] => 0
)
[120] => Array
(
[auth_id] => 120
[auth_name] => 管理员列表
[auth_pid] => 116
)
[121] => Array
(
[auth_id] => 121
[auth_name] => 管理员添加
[auth_pid] => 116
)
[122] => Array
(
[auth_id] => 122
[auth_name] => 数据一览
[auth_pid] => 100
)
[123] => Array
(
[auth_id] => 123
[auth_name] => 更新日志
[auth_pid] => 100
)
)
注意到这里,是采取引用的方式,为什么呢?因为后面,其实我们的数组元素是会变化的
当foreach第三次循环的时候,同样分析
这里也是采取了引用,还是那个原因,因为当前遍历的元素很有可能还有子分类,当有子分类的时候,按照这个算法,他自己还要增加son这个键,所以采用引用赋值的方式,可以保证自己的结构是完美的,虽然这个例子使用的只有二级分类,实际上无论几级分类都是很完美的,而且在运行速度上可以说都是很快的,从时间复杂度来说只是一个for循环
引用博客的来源:https://blog.csdn.net/falcom_fans/article/details/75579663
以上就是引用方式实现的代码: