array_values不能降维,仅重排键名为连续数字索引;真正降维需递归+array_merge或PHP 8.1+的array_flat($arr, INF)。

直接用 array_values 不能降维,它只重排键名
很多人看到标题里带 array_values 就以为它能 flatten 数组,其实不是。array_values 的作用只是把数组的键重置为从 0 开始的连续数字索引,对嵌套结构完全无感。比如:
$arr = ['a' => [1, 2], 'b' => [3, 4]]; print_r(array_values($arr));
输出仍是二维:一个含两个子数组的索引数组,没变平。
真正有效的降维方式:递归 + array_merge
PHP 原生没有内置的 flatten 函数(8.1+ 才有 array_flat),所以得自己写。核心逻辑是判断每个元素是否为数组,是就递归展开,再用 array_merge 合并:
function array_flatten($arr) {
$result = [];
foreach ($arr as $item) {
if (is_array($item)) {
$result = array_merge($result, array_flatten($item));
} else {
$result[] = $item;
}
}
return $result;
}
- 适用于任意深度,包括空数组、混合类型(字符串/数字/NULL)
- 注意
array_merge对非数字键会重排,如果需保留原始键(如关联键名有意义),得换用$result += ...或其他策略 - 深层嵌套时存在递归调用栈风险,生产环境建议加深度限制
PHP 8.1+ 可直接用 array_flat,但要注意参数
新版 PHP 提供了原生支持,但默认只降一层:
立即学习“PHP免费学习笔记(深入)”;
$arr = [1, [2, [3, 4]], 5]; var_dump(array_flat($arr)); // [1, 2, [3, 4], 5] —— 只扁平化一级
要彻底降维,必须显式传入深度参数:
-
array_flat($arr, 1):等价于默认行为,降一层 -
array_flat($arr, INF):无限深度,彻底展平(推荐) -
array_flat($arr, 2):只降两层,适合控制粒度
注意:array_flat 不修改原数组,返回新数组;且对非数组元素不做处理,安全。
容易踩的坑:引用、键丢失、性能陷阱
降维看似简单,实际在真实项目中常翻车:
- 用
foreach遍历时直接unset原数组再array_merge,会导致键错乱或跳过元素——永远用新数组收集结果 - 用
json_encode+json_decode强转再正则匹配数字,看似取巧,但会丢掉类型(所有数字变字符串)、破坏 NULL 和布尔值 - 大数组递归 flatten 容易爆内存或超时,尤其是含大量小数组的场景;可考虑迭代写法(用栈模拟递归)或分块处理
-
array_flat($arr, INF)在 PHP 8.1+ 下虽方便,但若数组含循环引用(如对象或引用数组),会抛出Fatal error: Nesting level too deep
真正要稳,优先选明确可控的递归函数,或升级到 8.1+ 后用 array_flat($arr, INF),但务必检查输入是否可能含循环结构。











