无限级分类子分类读取的问题?

作者站长头像
站长
· 阅读数 15

数据库中有个area地区表,含有如下字段:

idarea_name(地区名称)pid(父id)level(层级)
1安徽省01
2江苏省01
3江西省01
4合肥市12
5南昌市32
6九江市32
7肥东县43
8桃园镇74
9八斗乡85
10长丰县43

使用thinkphp框架,写了一个根据给定的地区id,读取出该地区下面的所有的地区信息函数。

//$id为地区id
function getChildArea($id){
        if(!$id){
            return;
        }
        static $area;
        $area = $area ?? new \app\common\model\Area;
        $result = collection($area->where(['pid'=>$id])->order('id desc')->select())->toArray();
        static $res = [];
        if($result){
            foreach ($result as $key=>$val) {
                $res[] = $val;
                getChildArea($val['id']); 
            }
        }
        return $res;
    }
getChildArea(1);

得到的结果:0:[id:1,area_name:'安徽省',pid:0,level:1],1:[id:4,area_name:'合肥市',pid:1,level:2],2:[id:7,area_name:'肥东县',pid:4,level:3],3:[id:8,area_name:'桃园镇',pid:7,level:4],4:[id:9,area_name:'八斗乡',pid:8,level:5],5:[id:10,area_name:'长丰县',pid:4,level:3]

但是这个函数,返回出来的是一个一维数组,我想得到的是一个多维数组(最上面就一个安徽省,然后这个数组中包含市一级的信息,市一级的数组中再包含县一级的数组,以此类推)求帮助

回复
1个回答
avatar
test
2024-07-16

你可以根据你的需求对这个方法进行改动用这个方法转一下

 /**
     * 方法 deal_list_to_tree2,一维数组根据$parent_id的值转为多维数组
     *
     * @param array $data 待处理的一维数组
     * @param string $pkName 用于转化为多维数组的主键字段
     * @param string $pIdName 用于转化为多维数组的字段(根据该字段值转换)
     * @param string $childName 子级的字段名
     * @param bool $is_empty_childrens 是否返回空的子数组(childrens[])(true:是,false:否)
     * @param string $rootId 根节点$pkName值
     *
     * @return array $new_data 返回处理好的(多层级)多维数组
     *
     */
   function deal_list_to_tree2($data, $pkName='id', $pIdName='parent_id', $childName='children_list', $is_empty_childrens=false, $rootId=''){
        $new_data = [];
        if(!empty($data)){
            foreach($data as $sorData){
                if(array_key_exists($childName, $sorData) && !empty($sorData[$childName])){
                    $res = deal_list_to_tree2($data, $pkName, $pIdName, $childName, $is_empty_childrens, $sorData[$pkName]);
                }else{
                    if($sorData[$pIdName] == $rootId){
                        if($sorData[$pkName] != $rootId){
                            $res = deal_list_to_tree2($data, $pkName, $pIdName, $childName, $is_empty_childrens, $sorData[$pkName]);
                        }
                        if(!empty($res) && !$is_empty_childrens){
                            if(array_key_exists($childName, $sorData)) {
                                if(array_key_exists($childName, $sorData)){
                                    for($i=0; $i < count($res); $i++){
                                        $sorData[$childName][] = $res[$i];
                                    }
                                }else{
                                    $sorData[$childName][] = $res;
                                }
                            }else{
                                $sorData[$childName] = $res;
                            }
                        }
                        $new_data[] = $sorData;
                    }
                }
            }
        }
        return $new_data;
    }
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容