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

数据库中有个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]

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

阅读 2.2k
1 个回答

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

 /**
     * 方法 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;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏