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
相关产品推荐
相关产品推荐

