
本文详解如何将多个子数组(如从循环中动态生成的二维结构)扁平化合并为一个一维索引数组,解决 array_merge() 在多维场景下失效的问题,并提供可复用的 foreach 扁平化方案。
本文详解如何将多个子数组(如从循环中动态生成的二维结构)扁平化合并为一个一维索引数组,解决 `array_merge()` 在多维场景下失效的问题,并提供可复用的 foreach 扁平化方案。
在 PHP 开发中,常遇到需合并多个“数组的数组”(即外层数组每个元素本身是一个一维关联/索引数组)的场景,例如从多次数据库查询、API 分页响应或 foreach 循环中累积获取的数据。此时若直接使用 array_merge($arr1, $arr2),可能无法达到预期效果——因为 array_merge() 对数值键会重新索引,但若传入的是单个变量(如 array_merge($my_array)),它仅接收一个参数,等同于无效操作;而若误用 array_merge(...$my_array)(展开语法),又会因 $my_array 是二维结构(如 [0 => [a,b], 1 => [c,d]])导致错误层级合并。
正确做法是手动遍历外层数组,逐个提取内层数组的元素并追加至新数组。核心逻辑如下:
- 初始化一个空的一维结果数组(如
$newArray = []); - 外层
foreach遍历主数组(每个元素为一个子数组); - 内层
foreach遍历该子数组中的每个关联数组(即目标数据项); - 使用
$newArray[] = $v追加,PHP 自动分配连续整数键(0, 1, 2…),实现无缝扁平化。
以下是完整可运行示例:
<?php
$my_array = [
[
['id' => '121', 'slug' => 'btm-dc-402'],
['id' => '122', 'slug' => 'btm-dc-403'],
],
[
['id' => '493', 'slug' => 'jog-buah-401'],
['id' => '946', 'slug' => 'dps-buah-356'],
],
];
$newArray = [];
foreach ($my_array as $subArray) {
foreach ($subArray as $item) {
$newArray[] = $item;
}
}
print_r($newArray);
// 输出:
// Array
// (
// [0] => Array ( [id] => 121 [slug] => btm-dc-402 )
// [1] => Array ( [id] => 122 [slug] => btm-dc-403 )
// [2] => Array ( [id] => 493 [slug] => jog-buah-401 )
// [3] => Array ( [id] => 946 [slug] => dps-buah-356 )
// )✅ 优势说明:
立即学习“PHP免费学习笔记(深入)”;
- 兼容所有 PHP 版本(无需
...展开语法); - 逻辑清晰,易于调试与扩展(例如可在此过程中添加过滤、去重或字段转换);
- 时间复杂度 O(n),性能稳定。
⚠️ 注意事项:
- 切勿对原始二维结构直接调用
array_merge($my_array)—— 这只会返回原数组,无合并效果; - 若需保留原始键名(非数字索引),应改用
$newArray[key($subArray)] = $item等方式,但本例需求明确要求连续数字索引; - 如数据源来自用户输入或外部 API,建议在追加前校验
$item是否为数组(is_array($item)),避免潜在 Notice 错误。
此方法是处理“多组同类数据聚合”的通用范式,适用于分页拉取、多条件查询合并、批量导入等典型业务场景。



















