无限级分类子分类读取的问题?
数据库中有个area地区表,含有如下字段:
id | area_name(地区名称) | pid(父id) | level(层级) |
---|---|---|---|
1 | 安徽省 | 0 | 1 |
2 | 江苏省 | 0 | 1 |
3 | 江西省 | 0 | 1 |
4 | 合肥市 | 1 | 2 |
5 | 南昌市 | 3 | 2 |
6 | 九江市 | 3 | 2 |
7 | 肥东县 | 4 | 3 |
8 | 桃园镇 | 7 | 4 |
9 | 八斗乡 | 8 | 5 |
10 | 长丰县 | 4 | 3 |
使用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个回答

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;
}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容