php请求接口的数据,拼接三级联动

image.png
我需要把接口返回的数据拼接成上图的方式,我写出来一个,但是请求接口三次直接卡死了。
image.png

对这方面不是很熟悉,希望各位指点迷津!谢谢

现在我能把数据拼接成我需要的格式了

    $cityList = api('app\system\api\sysproducts_category','getAllList', $params);

    $data = [];

    foreach ($cityList as $key => $value) {
        $data[$key] = [
            "id" => $value['id'],
            "category_name" => $value['category_name'],
            "parent_id" => $value['parent_id'],
            "is_show" => $value['is_show'],
            "image" => $value['image'],
            "describe" => $value['describe'],
            "twolevel" => []
        ];
        foreach ($cityList as $key2 => $value2) {
            if ($value2['parent_id'] == $value['id']) {
                $data[$key]['twolevel'][$key2] = [
                    "id" => $cityList[$key2]['id'],
                    "category_name" => $cityList[$key2]['category_name'],
                    "parent_id" => $cityList[$key2]['parent_id'],
                    "is_show" => $cityList[$key2]['is_show'],
                    "image" => $cityList[$key2]['image'],
                    "describe" => $cityList[$key2]['describe'],
                    "threelevel" => []
                ];
                foreach ($cityList as $key3 => $value3) {
                    if ($value3['parent_id'] == $value2['id']) {
                        $data[$key]['twolevel'][$key2]['threelevel'][$key3] = [
                            "id" => $value3['id'],
                            "category_name" => $value3['category_name'],
                            "parent_id" => $value3['parent_id'],
                            "is_show" => $value3['is_show'],
                            "image" => $value3['image'],
                            "describe" => $value3['describe'],
                        ];
                    }
                }
                
            }
            
        }
    }
    
    

但是又有问题来了,后台求得数据如下
image.png
二级数组三级数组里面的键值我想去掉。

阅读 2k
2 个回答

卡死可能很多原因,不过单从代码来看,有以下错误需要修正:

foreach ($cityList as $key => $v) { // ... }
foreach ($cityTow as $key => $i) { // $key被重新定义了一次
    // 里面这个$key变量,已经不是外层$cityList的$key了
    $data[$key];
}
foreach ($cityThree as $key -> $t) { // $key又被重新定义了一次
    // 同理,里面这个$key变量,也已经不是外层$cityList的$key了
    $data[$key];
}

需要把各个循环的key,命名成$cityListKey, $cityTowKey, $cityThreeKey之类。
然后看问题是否解决,然后再进一步分析。

续问题二

PHP中,如果数组内元素有自定义了键名的话,在json_encode()的时候,会将它转成对象形式。
反之,不自定义键名,让它按自然数排序,可转成结构更简洁的数组形式:

foreach ($cityList as $key2 => $value2) {
    if ($value2['parent_id'] == $value['id']) {
        // 我们下面会把,所有要拼接的数据,都在此变量暂存
        $twolevelCity = [
            "id" => $cityList[$key2]['id'],
            // ...
        ];
        foreach ($cityList as $key3 => $value3) {
            if ($value3['parent_id'] == $value2['id']) {
            $twolevelCity['threelevel'][] = [ // 三级的数据也是先存在我们的变量上
                // ...
            ];
        }
        // 最后再去把,拼好的,单个二级城市,以及其下所有三级城市数据,
        // 不写键名,直接推进数组
        $data[$key]['twolevel'][] = $twolevelCity;
    }
}

核心是用好$array[] = $value这种不自定义键的方式给数组添加元素。
这样在json_encode的时候,就能得到想要的简洁效果啦。

  1. 楼上已经说了,三个循环应该使用不一样的 key,否定会相互覆盖;
  2. 可以考虑先只返回第一级,在前端展示,用户点击后再去获取下一级;
  3. 可以考虑一次返回所有,再在返回的结果中使用递归获取父子关系;
  4. 其实一次请求多个结果也不一定很慢,具体快慢可以实测后再判断,很多时候程序比你想的要跑得快得多。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题