以迭代(非递归)方式获取无限分类中所有的最后一层子节点数据

 $sql2 = "select cfg.parent_id,cfg.depth,cfg.name,cfg.val,cfg.id from cfg_dictionaries as cfg where cfg.dict_id=103 and valid =1";//查询数据库,获取到所有的数据
        $res2 = $this->$model->query($sql2);
        $depth = 0;//最大深度
        //获取最大深度(注明:在数据库中存放有一个字段depth用来标记该记录所在的深度)
        foreach($res2 as $key=>$val){
            $res2[$key] = $val['cfg'];
            //如果当前记录中的depth大于$depth,则重新赋值$depth
            if($val['cfg']['depth']>$depth){
                $depth = $val['cfg']['depth'];
            }

        }
//        按数组深度拆分查询结果(即:将深度为1的存放在一起,深度为2的存放在一起.....)
        for($i=1;$i<=$depth;$i++){
            foreach($res2 as $v){
                if($v['depth']==$i){
                    $cfArr[$i][] = $v;
                }
            }
        }
        //直接将最后一级节点取出(最大深度的数组中存放的肯定是最后一级节点,不会有子节点)
        $gcsjArr[] = $cfArr[$depth];
        $pidArr = array();
//        //从最大深度(即最后一级节点)往前迭代,依次遍历出所有的父节点(所有含有子节点的节点)的id。从最后一层和倒数第二层进行比较,如果倒数第二层记录中的id等于最后一层的记录的父id(parent_id),则将该id(或parent_id)放入父id数组中
        //第$depth,$depth-1,.....3,2层
        for($i=$depth;$i>=2;$i--){
        //第$depth-1,.....3,2,1层
            for($j=$i-1;$j>=1;$j--){
                //遍历第$i层中的所有记录
                foreach($cfArr[$i] as $key1=>$value1){
                    //遍历第$i-1层中的所有记录
                    foreach($cfArr[$j] as $key2=>$value2){
                        //相连两层记录的数据进行比较
                        if($value1['parent_id']==$value2['id']){
                            //如果相同,则将该id存起来
                            $pidArr[]= $value1['parent_id'];
                        }
                    }
                }

            }
        }
        //逆序  逐层将没有子节点的数据放入新数组。从倒数第二层开始,如果该记录的id不在父id数组中,则说明该记录为最后一层
        for($j=$depth-1;$j>=1;$j--){
            foreach($cfArr[$j] as $key3=>$val3){
                if(!in_array($val3['id'],$pidArr)){
                    $gcsjArr[0][] = $val3;
                }
            }

        }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值