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

    xiaoxiao2021-04-12  35

    $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; } } }
    转载请注明原文地址: https://ju.6miu.com/read-667834.html

    最新回复(0)