php递归树的实现

使用到了https://github.com/akanehara/ginq,这个类库可以在php中像.net一样使用linq

private function gettree(&$list, &$parent=null, &$tree=array())
    {
        $query = Ginq::from($list)->where(function ($m) use ($parent) {
            if (empty($parent)) {
                return  $m['parentId']==null;
            } else {
                return  $m['parentId']==$parent['id'];
            }
        })->toArray();

        foreach ($query as $k => $row) {
            $node =  $row->toArray();
            $node['children']=array();

            $v = Ginq::from($list)->count(function ($m) use ($row) {
                return $m['parentId']==$row['id'];
            });
            if ($v>0) {
                $this->gettree($list, $node, $tree);
            }

            if (!empty($parent)) {
                $parent['children'][]=$node;
            } else{
                $tree[]=$node;
            }
        }

        return $tree;
    }

这种实现一个是练习php的递归,另一个是学习linq的php用法,还有个简易的代码来实现递归树,同事给的,在我这里跑不起来

function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0)
    {
        // 创建Tree
        $tree = array();
        if (is_array($list)) {
            // 创建基于主键的数组引用
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] =& $list[$key];
            }
            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId = $data[$pid];
                if ($root == $parentId) {
                    $tree[] =& $list[$key];
                } else {
                    if (isset($refer[$parentId])) {
                        $parent =& $refer[$parentId];
                        $parent[$child][] =& $list[$key];
                        // $parent['children'][] =& $list[$key];
                    }
                }
            }
        }
        return $tree;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值