$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;
}
}
}
以迭代(非递归)方式获取无限分类中所有的最后一层子节点数据
最新推荐文章于 2022-10-31 10:56:26 发布