array_values()是最安全可靠的重新索引方法,它丢弃原键、生成从0开始的连续数字索引新数组,不修改原数组,对各类数组一致有效;手动赋值、array_merge()或array_splice()等替代方案存在逻辑冗余、覆盖风险或版本兼容问题。

PHP array_values() 是最直接的重新索引方法
遍历数组本身不会改变键名,所谓“重新索引”其实是生成一个新数组,让所有元素按顺序获得从 0 开始的连续数字键。最安全、最常用的方式就是用 array_values() —— 它只保留值,丢弃原键,自动分配数字索引。
常见错误是试图在 foreach 中手动重设键(比如 $newArr[] = $val),这虽然也能得到数字键,但逻辑冗余且容易在条件跳过时出错;更危险的是用 array_merge($arr) 伪重索引,它在关联数组中看似有效,但一旦原数组含字符串键且有重复,array_merge() 会静默覆盖,行为不可控。
-
array_values()明确语义,不修改原数组,返回全新索引数组 - 对空数组、全数字键数组、全字符串键数组都一致可靠
- 性能开销极小,底层 C 实现,比手写循环快得多
什么时候不能只靠 array_values()?
如果你遍历后做了筛选(如 unset() 或条件过滤),再调用 array_values() 才真正有意义;如果只是单纯 foreach 读取一遍,数组本身没变,调用它只是白跑一次。
典型场景:用 foreach + if 构建新数组,但忘了用 [] 追加而是用了原键赋值,结果得到稀疏或乱序键:
$data = ['a' => 1, 'b' => 2, 'c' => 3];
$result = [];
foreach ($data as $k => $v) {
if ($v > 1) {
$result[$k] = $v; // 错!保留了 'b'=>2, 'c'=>3,键没重排
}
}
// 此时 $result 仍是 ['b'=>2, 'c'=>3],不是 [0=>2, 1=>3]
// 正确做法:$result[] = $v; 或最后补一句 $result = array_values($result);
array_splice() 和 array_merge() 的陷阱
有人用 array_splice($arr, 0) 或 array_merge([], $arr) 想绕过 array_values(),这些在简单场景下可能“碰巧”生效,但有隐性风险:
-
array_splice($arr, 0)会修改原数组(即使你不用返回值),且返回值行为依赖 PHP 版本,在 PHP 8.0+ 中才保证返回切片后的新数组 -
array_merge([], $arr)在$arr含非数字键时等价于array_values(),但若$arr是空数组或含null键,array_merge()可能触发警告或返回意外结构 - 两者都不如
array_values()直观、可读、可维护
多维数组需要递归处理
array_values() 只作用于顶层,遇到嵌套数组不会深入。如果你遍历的是二维数组并希望每层都重索引,得自己递归或用 array_walk_recursive() 配合重建逻辑——但注意:array_walk_recursive() 不保留键路径,只遍历叶子值,无法还原结构。
真正需要递归重索引时,推荐封装函数:
function reindex_recursive($arr) {
$arr = array_values($arr);
foreach ($arr as $k => $v) {
if (is_array($v)) {
$arr[$k] = reindex_recursive($v);
}
}
return $arr;
}
这种写法清晰可控,比依赖魔术函数更可靠。不过多数业务场景只需顶层重索引,别一上来就写递归——先确认是否真有深层索引混乱的问题。
重新索引这件事,核心就一条:别在遍历里动键,该用 array_values() 的时候别省那几个字符;真正复杂的结构,宁可多写几行明确逻辑,也别赌某个函数的边缘行为。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











