You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何将数组以方括号而非大括号格式输出?

解决Laravel中Collection转方括号数组的问题

嘿,我来帮你搞定这个问题!首先得说个关键细节:你期望的那个JSON格式其实不符合标准JSON语法——JSON里的数组(方括号包裹的)不能包含"VELBL": {...}这种键值对,只能是有序的值列表。不过咱们可以调整结构,既满足你要用方括号包裹的需求,又保证输出的JSON是合法可用的。

重构代码实现目标结构

咱们别手动写foreach了,用Laravel Collection的强大方法来处理,代码更简洁还不容易出错:

$item_list['grid'] = $items
    // 先按颜色把所有项分组
    ->groupBy('color')
    // 遍历每个颜色组,生成需要的结构
    ->map(function ($colorGroup) {
        return [
            'color' => $colorGroup->first()->color,
            'size_grid' => $colorGroup
                // 处理每个尺寸项,生成指定结构
                ->map(function ($item) {
                    return [
                        'size_no' => $item->size_no,
                        'size_description' => $item->size_desc,
                        'on_hand' => $item->on_hand,
                    ];
                })
                // 把关联数组转成索引数组(去掉键,变成方括号包裹)
                ->values()
                // 转成普通PHP数组
                ->all();
        ];
    })
    // 同样把颜色组的关联数组转成索引数组
    ->values()
    ->all();

代码作用拆解

  • groupBy('color'):把原始的Collection按color字段分组,得到以颜色为键的集合
  • 外层map:遍历每个颜色组,生成包含color和size_grid的数组
  • 内层map:遍历颜色组里的每个尺寸项,生成你需要的尺寸数据结构
  • values():这个方法会去掉集合的关联键,把它转换成索引数组(对应JSON里的方括号格式),不管是外层的颜色组还是内层的尺寸组,都得调用这个方法
  • all():最后把Collection转换成普通PHP数组,方便后续返回JSON

最终合法的JSON输出

这样处理后,你会得到符合标准JSON语法的结构,同时满足方括号包裹的需求:

"grid": [
    {
        "color": "VELBL",
        "size_grid": [
            {"size_no":3,"size_description":"MEDIUM","on_hand":"0"},
            {"size_no":5,"size_description":"X LARGE","on_hand":"0"},
            {"size_no":4,"size_description":"LARGE","on_hand":"0"},
            {"size_no":1,"size_description":"X SMALL","on_hand":"0"},
            {"size_no":2,"size_description":"SMALL","on_hand":"0"}
        ]
    },
    {
        "color": "BLUAS",
        "size_grid": [
            {"size_no":3,"size_description":"MEDIUM","on_hand":"0"},
            {"size_no":1,"size_description":"X SMALL","on_hand":"0"},
            {"size_no":2,"size_description":"SMALL","on_hand":"0"},
            {"size_no":4,"size_description":"LARGE","on_hand":"0"},
            {"size_no":5,"size_description":"X LARGE","on_hand":"0"}
        ]
    }
]

如果你确实需要保留size_no作为每个尺寸项的标识,可以调整内层的map逻辑,让每个尺寸项带上键名:

// 把内层的map改成这样
->map(function ($item) {
    return [
        'key' => $item->size_no,
        'size_no' => $item->size_no,
        'size_description' => $item->size_desc,
        'on_hand' => $item->on_hand,
    ];
})

这样输出的size_grid数组里每个元素都带有key字段,标识对应的尺寸编号,同时保持JSON合法。

补充说明你之前的问题

你之前用array_values($item_list['grid'])把外层grid转成了数组,但内层size_grid没变化,是因为你需要对每个颜色组里的size_grid也执行一次array_values处理。不过用Laravel Collection的方法会更符合Laravel的开发习惯,代码也更简洁~

内容的提问来源于stack exchange,提问作者user13080158

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:57:27