
本文介绍如何在 laravel 中不使用显式循环,高效提取多维嵌套结构中指定键(如 `data_array`)的所有子项,并合并为一个一维数组。核心方案基于 laravel 的集合(collection)方法链:`pluck()` + `flatten()`。
在处理类似如下嵌套 JSON 数据时:
{
"id": "60561bbd1be6cb1972254ec4",
"main_array": [
{
"data_array": [
{ "_id": "6054d5c3dbd0af1cca71b857", "qty": 2000 }
]
},
{
"data_array": [
{ "_id": "6054d5c3dbd0af1cca71b859", "qty": 78970 },
{ "_id": "6054d5c3dbd0af1cca71b860", "qty": 978 }
]
}
]
}目标是将所有 main_array 中每个元素的 data_array 合并为一个扁平的一维数组,即:
[ [ '_id' => '6054d5c3dbd0af1cca71b857', 'qty' => 2000 ], [ '_id' => '6054d5c3dbd0af1cca71b859', 'qty' => 78970 ], [ '_id' => '6054d5c3dbd0af1cca71b860', 'qty' => 978 ] ]
传统方式需借助 foreach 循环与 array_merge(),代码冗长且可读性弱:
$expectedArray = [];
foreach ($inputs['main_array'] as $item) {
$expectedArray = array_merge($expectedArray, $item['data_array']);
}而 Laravel 提供了更优雅、函数式、无副作用的替代方案——利用 Collection 的链式操作:
$flatDataArray = collect($inputs['main_array'])
->pluck('data_array') // 提取每个元素的 'data_array' 值,得到二维数组
->flatten(1); // 扁平化一层(关键!避免深度展开)✅ pluck('data_array') 返回一个包含多个 data_array 子数组的集合,例如:
collect([ [[ '_id' => '...', 'qty' => 2000 ]], [[ '_id' => '...', 'qty' => 78970 ], [ '_id' => '...', 'qty' => 978 ]] ])
✅ flatten(1) 显式指定仅展开一层,确保不会误将对象内部字段(如 _id 字符串)也拆解。若省略参数,默认 flatten() 会递归展开全部层级,可能导致意外行为。
? 补充技巧:若需进一步转换(如统一字段名、过滤空值),可无缝追加方法:
$flatDataArray = collect($inputs['main_array'])
->pluck('data_array')
->flatten(1)
->filter() // 过滤 null/empty 子项
->map(function ($item) {
return array_merge($item, ['source' => 'main_array']); // 添加元信息
})
->values(); // 重置键为数字索引(可选)⚠️ 注意事项:
- 确保 $inputs['main_array'] 是 PHP 数组(非 JSON 字符串);若为 JSON,请先调用 json_decode($json, true);
- flatten(1) 中的 1 不可省略或写错,否则对含嵌套对象的结构可能产生非预期结果;
- 该方案依赖 Laravel 的 Illuminate\Support\Collection,纯 PHP 环境需自行实现或引入第三方库(如 nesbot/carbon 附带的辅助函数不适用,推荐改用原生 array_reduce + array_merge 组合)。
综上,通过 collect()->pluck()->flatten(1) 三步即可替代手动循环,在保持代码简洁性的同时提升可维护性与可测试性,是 Laravel 生态中处理嵌套数组聚合任务的标准实践。










