递归优化php,PHP递归优化 使用匿名函数进行递归

> ```

> public function treeBack($data,$pid){

> foreach($data as $k=>$v){

> if($v['pid'] == $pid){

> $v['child'] = $this->treeBack($data,$v['id']);

> $tree[] = $v;

> unset($data[$k]);

> }

> }

> return $tree;

> }

> ```

- 如上代码,这是一段很经典的无限递归循环逻辑,但是当数据量超过2000 - 3000行时,效率大打折扣,经过我们的实际应用测试,在没有优化这段代码之前,递归所耗费的时间是 2s 左右

- 但是经过优化之后,递归逻辑耗费的时间仅仅只有 86ms 左右

- OK,贴出下优化后的代码再来分析

> ```

> public function treeBack($data, $pidKey='pid', $idKey = 'id', $childKey='child') {

> $grouped = array();

> foreach ($flat as $sub){

> $grouped[$sub[$pidKey]][] = $sub;

> }

> $fnBuilder = function($siblings) use (&$fnBuilder, $grouped, $idKey, $childKey) {

> foreach ($siblings as $k => $sibling) {

> $id = $sibling[$idKey];

> if(isset($grouped[$id])) {

> $sibling[$childKey] = $fnBuilder($grouped[$id]);

> usort($sibling[$childKey], function($a, $b) use ($childKey) {

> if ($a[$childKey] == $b[$childKey]) {

> return 0;

> }

> return ($a['weight'] < $b['weight']) ? -1 : 1;

> });

> }

> $siblings[$k] = $sibling;

> }

> return $siblings;

> };

> $tree = $fnBuilder($grouped[0]);

> return $tree;

> }

> ```

- 恩,你没有看错,将数据重新构造,然后进行匿名函数循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值