
本文介绍在 Laravel 中高效扁平化多维数组的方法,重点使用 Collection 的 flatten() 方法,适用于合并数组内嵌的子数组,快速获得一维结构化数据。
本文介绍在 laravel 中高效扁平化多维数组的方法,重点使用 collection 的 `flatten()` 方法,适用于合并数组内嵌的子数组,快速获得一维结构化数据。
在 Laravel 开发中,常遇到类似如下嵌套结构的数据:一个数组包含多个子数组,每个子数组又包含若干关联数组(如 JSON 对象或 Eloquent 模型数组),而业务逻辑需要将其统一转为单层数组以便后续处理(如批量插入、API 响应、数据校验等)。此时,原生 PHP 的 array_merge() 或 call_user_func_array('array_merge', $arrays) 并不能直接解决——因为 $data 本身是一个二维数组(即「数组的数组」),而非多个独立数组参数。
正确且 Laravel 风格的解决方案是借助 Eloquent Collection 提供的链式方法:
$flattened = collect($data)->flatten(1)->values()->all();
- collect($data):将原生 PHP 数组转换为 Laravel Collection 实例;
- flatten(1):指定深度为 1,表示仅展开第一层嵌套(即把 [ [a,b], [c], [d,e] ] 变成 [a,b,c,d,e]);若省略参数,默认递归展开所有层级(可能破坏对象结构,慎用);
- values():重置数组键为连续数字索引(避免因键名冲突或缺失导致的稀疏数组);
- all():将 Collection 转回标准 PHP 索引数组,便于 JSON 序列化或传递给非 Collection 接口。
✅ 示例验证:
$data = [
[
['view_id' => 1, 'meta_detail_id' => 1],
['view_id' => 2, 'meta_detail_id' => 1]
],
[
['view_id' => 7, 'meta_detail_id' => 4]
]
];
$result = collect($data)->flatten(1)->values()->all();
// 输出:
// [
// ['view_id' => 1, 'meta_detail_id' => 1],
// ['view_id' => 2, 'meta_detail_id' => 1],
// ['view_id' => 7, 'meta_detail_id' => 4]
// ]
⚠️ 注意事项:
- flatten() 仅适用于数值索引的嵌套数组;若子数组含字符串键(如 ['users' => [...]]),需先用 map->values() 清理或改用 collapse()(专用于「数组的数组」且自动重索引);
- 若 $data 可能为空或非数组类型,建议前置校验:is_array($data) && !empty($data);
- 在 Blade 或 API 资源中可直接返回 collect($data)->flatten(1),Laravel 会自动序列化为 JSON 数组。
总结:相比手动循环或 array_merge(...$data)(需确保 $data 是「多个数组」而非「一个二维数组」),collect()->flatten(1) 更简洁、安全、语义清晰,是 Laravel 生态中处理此类场景的推荐实践。











