php 怎么把省市区的数据表,组成父子级数组,省里面有children市,市里有children区

如下图,数据表里为省份的都是parent_id为0的,市的parent_id是省,区的parent_id是市。
我想把数据循环下来,组成数组。
比如:

 data: [{value: 1, label: '北京', children: [
        {
            value: 1, label: '北京市', children: [
                { value: 1, label: '东城区' },
                { value: 2, label: '西城区' },
                { value: 3, label: '崇文区' },
                { value: 4, label: '宣武区' },
                { value: 5, label: '朝阳区' },
                { value: 6, label: '丰台区' },
                { value: 7, label: '石景山区' },
                { value: 8, label: '海淀区' },
                { value: 9, label: '门头沟区' },
                { value: 10, label: '房山区' },
                { value: 11, label: '通州区' },
                { value: 12, label: '顺义区' },
                { value: 13, label: '昌平区' },
                { value: 14, label: '大兴区' },
                { value: 15, label: '怀柔区' },
                { value: 16, label: '平谷区' },
                { value: 17, label: '密云县' },
                { value: 18, label: '延庆县' }
            ]
        }
    ]}]
    

image.png

阅读 4.5k
3 个回答

感谢各位大佬的评论回答,最终用了以下方法解决,后端用的是TP6,前端用的是vue+element
,返回的数据主要是为了用在前端element组件Cascader 级联选择器里面。

image.png

数据库获取下来的数组 value是唯一id,parent_id是父级id,level是级别(0是省,1是市,2是区)
image.png

//获取数据表里的数据
public function getCityAllList(Request $request)
{
    $params = $request->params ?? request()->param();
    $oldData = api('app\system\api\SystemCity', 'getAllList', []);
    //获取到的数据 调用getTree方法
    $newData = $this->getTree($oldData, 0);
    return toTrue($newData);
}

public function getTree($data, $pId)
{
    $tree = [];
    foreach($data as $k => $v)
    {
        if($v['parent_id'] == $pId)
        {
            if ($v['level'] != 2) { //到区的时候就不用再循环了
                $v['children'] = $this->getTree($data, $v['value']);
            }
            $tree[] = $v;
            unset($data[$k]);
        }
    }
    return $tree;
}


最终的数据
image.png

新手上路,请多包涵

直接去网上搜,省市级联

const data = [
    { id: 51, name: "四川省", parentId: 0 },
    { id: 52, name: "贵州省", parentId: 0 },
    { id: 5101, name: "成都市", parentId: 51 },
    { id: 5102, name: "绵阳市", parentId: 51 },
    { id: 5103, name: "德阳市", parentId: 51 },
    { id: 510201, name: "涪城区", parentId: 5102 },
    { id: 5201, name: "贵阳市", parentId: 52 },
    { id: 520101, name: "某区", parentId: 52 },
]

function makeTree(list) {
    // 注意,如果不想改变原数据,需要在生成 dict 之前做个深拷贝,大概是
    // list = list.map(it => ({ ...it }));
    // 这里只做了两层拷贝,因为数组只有两层

    // 先生成一张映射表,好找
    const dict = new Map(list.map(it => [it.id, it]))

    // 生成一个根节点
    const root = { children: [] };
    dict.set(0, root);

    // 再遍历处理关系就好
    list.forEach(it => {
        const parent = dict.get(it.parentId ?? 0) ?? root;
        (parent.children ??= []).push(it);
    });

    return root.children;
}

const r = makeTree(data)
console.log(JSON.stringify(r, null, 2));
console.log(JSON.stringify(data));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题