php一次性输出三级联动数据json格式

有下面这样一张数据表
图片描述

然后要一次性输出这样的json数据:

$.rawCitiesData = [
  {
    "name":"北京",
    "code":"对应的数据id",
    "sub": [
      {
        "name": "北京市",
        "code": "对应的数据id",
        "sub":[
            {
              "name":"东城区",
              "code":"110101"
            },
            {
              "name":"西城区",
              "code":"110102"
            },
            {
              "name":"朝阳区",
              "code":"110105"
            },
            {
              "name":"丰台区",
              "code":"110106"
            },
            {
              "name":"石景山区",
              "code":"110107"
            },
            {
              "name":"海淀区",
              "code":"110108"
            },
            {
              "name":"门头沟区",
              "code":"110109"
            },
            {
              "name":"房山区",
              "code":"110111"
            },
            {
              "name":"通州区",
              "code":"110112"
            },
            {
              "name":"顺义区",
              "code":"110113"
            },
            {
              "name":"昌平区",
              "code":"110114"
            },
            {
              "name":"大兴区",
              "code":"110115"
            },
            {
              "name":"怀柔区",
              "code":"110116"
            },
            {
              "name":"平谷区",
              "code":"110117"
            },
            {
              "name":"密云县",
              "code":"110228"
            },
            {
              "name":"延庆县",
              "code":"110229"
            }
        ]
      }
    ]
  },

只用输出数据表中的id和name 其余字段都不需要

数据表说明
pid=0表示顶级分类
child如果等于1表示还有下级分类

还请大神赐教,这个php该怎么写啊

阅读 4.2k
2 个回答

两种方案,第一种是使用递归,遍历所有数据。
第二种是从第一级循环到第三级,因为你的数据貌似只有三级。

<?php
// 假设 pid 决定父子关系
// 下面的数组一次性从数据库获取完,可以做缓存
$items = [
    [
        'name' => '北京',
        'code' => '1',
        'pid' => '0'
    ],
    [
        'name' => '北京市',
        'code' => '2',
        'pid' => '1'
    ],
    [
        'name' => '东城区',
        'code' => '110101',
        'pid' => '2'
    ],
    [
        'name' => '西城区',
        'code' => '110102',
        'pid' => '2'
    ]
];
$generateTree = function ($items, $parentKey = 'pid') {
    $tree = $temp = [];
    foreach ($items as $item) {
        $temp[$item['code']] = $item;
    }
    foreach ($items as $item) {
        if (isset($temp[$item[$parentKey]])) {
            $temp[$item[$parentKey]]['sub'][] = &$temp[$item['code']];
        } else {
            $tree[] = &$temp[$item['code']];
        }
        // 下面可以去掉 pid 元素
        unset($temp[$item['code']][$parentKey]);
    }
    return $tree;
};

print_r($generateTree($items));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题