array_merge_recursive不能扁平化数组,仅递归合并;真正降维需用array_walk_recursive提取叶子值,或自定义递归函数拼接键路径保留键名。
array_merge_recursive 会保留多维结构,不是真正“扁平化”
很多人看到 array_merge_recursive 就以为能“把二维变一维”,结果发现键名冲突时自动嵌套、关联键没消失、数值键被重排——它只是递归合并,不是降维。比如:
$arr = ['a' => ['x' => 1], 'b' => ['y' => 2]]; var_dump(array_merge_recursive($arr)); // 还是二维,且 'a' 和 'b' 键还在
真正要的是“所有叶子值提上来,丢掉中间层级”,得自己遍历或用更精准的工具。
用 array_walk_recursive 最简洁可靠
array_walk_recursive 天然跳过中间数组,只对最终标量值回调,适合提取所有叶子节点:
- 它自动忽略非标量(如子数组),不报错也不中断
-
回调函数里直接
array_push或赋值到新数组即可 - 不关心原数组是数值索引还是关联键,只取值
示例:
立即学习“PHP免费学习笔记(深入)”;
$data = ['user' => ['name' => 'Alice', 'age' => 30], 'status' => 'active'];
$result = [];
array_walk_recursive($data, function($val) use (&$result) {
$result[] = $val;
});
// $result === ['Alice', 30, 'active']
注意:array_walk_recursive 不保留原始键名,如果需要键值对映射,得换方式。