php中做微信分享链路跟踪(无极限菜单应用)

最新做的工作当中有个任务是要做一个微信分享链路跟踪,效果图如下图所示:

为了实现这个工作任务学习进步了不少,特此记录一下,这里使用的是引用方式实现的代码,

需要使用的分析数据结构如图:

常用的递归算法如下:

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

以上就是引用方式实现的代码:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值