二维数组转一维数组的递归写法核心是“遇数组就拆,遇值就收”,兼容任意嵌套、关联键与数字键;带键名拼接可规整api数据;性能上应避免array_merge高频调用,超深嵌套宜改用迭代法。

二维数组转一维数组的递归写法,核心是「遇数组就拆,遇值就收」。它不依赖PHP版本,能处理任意嵌套深度,也兼容关联键和数字键,是最通用、最可控的方式之一。
基础递归函数(保留所有叶子值)
这是最常用、最清晰的实现:
- 定义一个空数组作为结果容器
- 遍历输入数组,对每个元素判断是否为数组
- 是数组 → 递归调用自身,把返回结果合并进来
- 不是数组 → 直接追加到结果数组
示例代码:
$arr = [[1, 2], ['a' => 3, 'b' => [4, 5]], 6];
function flatten($arr) {
$result = [];
foreach ($arr as $item) {
if (is_array($item)) {
$result = array_merge($result, flatten($item));
} else {
$result[] = $item;
}
}
return $result;
}
print_r(flatten($arr)); // [1, 2, 3, 4, 5, 6]
带键名拼接的递归(适合API数据规整)
如果原始结构含语义化键(如 ['user'=>['profile'=>['name'=>'Tom']]),想转成扁平键名(如 ['user_profile_name'=>'Tom']),需在递归中传递路径前缀:
- 用引用参数或返回合并数组避免重复拷贝大数组
- 跳过纯数字键(如
0,1)可选,避免生成_0_name这类无意义键 - 拼接建议用
$prefix ? $prefix . '_' . $key : $key处理首层
简版示例:
function flattenWithKeys($arr, $prefix = '') {
$result = [];
foreach ($arr as $key => $value) {
$newKey = is_numeric($key) ? $prefix : ($prefix ? $prefix . '_' . $key : $key);
if (is_array($value)) {
$result += flattenWithKeys($value, $newKey);
} else {
$result[$newKey] = $value;
}
}
return $result;
}
性能优化要点(大数组必看)
递归虽灵活,但要注意实际瓶颈:
- 避免在每层递归里用
array_merge($result, ...)—— 复杂度高,改用$result[] = $value或直接赋键$result[$k] = $v - 超深嵌套(>100层)可能触发栈限制,此时建议改用迭代法(如
RecursiveIteratorIterator) - 若只取值不要键,
array_walk_recursive()是原生最快方案,比手写递归少开销
为什么不用 array_merge($arr)?
这个写法常被误用:
- 它本质是「把二维数组的每个子项当参数传给 array_merge」,仅展开一层
-
[[1,2], [3,[4,5]]]会变成[1,2,3,[4,5]],第四层没动 - 遇到
['k'=>[1,2]]会报 Warning:第一个参数不是数组 - 所有键名丢失,强制重排为数字索引
真正需要完整降维时,递归仍是首选方案。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











