array_values()是最直接安全的重新索引方式,丢弃原键名生成从0开始的连续数字索引;它不修改原数组,仅重建键值映射,适用于需纯数字索引、JSON编码或调用排序函数等场景。

array_values() 是最直接、最安全的重新索引方式,它会丢弃原有键名,生成从 0 开始的连续数字索引。
你不需要“转换时”做特殊操作——PHP 数组本身没有固定“起始索引”,所谓“重新索引”本质是**重建键名映射**。关键看你要保留什么、丢弃什么。
什么时候必须用 array_values()
当你需要一个纯数字索引、且必须从 0 开始的数组时,比如:
- 后续要按
$arr[0]、$arr[1]访问(而非依赖原键) - 传给
array_multisort()、usort()、rsort()等函数后想确保索引规整 - JSON 编码时避免对象形式(关联数组转 JSON 是对象,数字索引数组才是 JSON 数组)
示例:
$arr = ['a' => 'apple', 'b' => 'banana']; $new = array_values($arr); // $new === [0 => 'apple', 1 => 'banana']
注意:array_values() 不修改原数组,需赋值接收;它只处理值,不关心类型,也不影响字符串键的原始值。
array_unshift() 和 array_push() 会自动重索引吗
会,但仅限于**数值键名部分**:
立即学习“PHP免费学习笔记(深入)”;
-
array_unshift()在开头插入后,所有原有数值键会被重置为0, 1, 2... -
array_push()不影响已有键,只追加新元素并分配下一个数字键(如原最大键是5,新元素键就是6) - 字符串键(如
'name')始终保留,不会被重索引
所以如果你的数组混有字符串键和数字键,array_unshift() 后只有数字键段被重排,字符串键照旧。这不是“全量重索引”,只是副作用。
别用 foreach + [] 模拟重索引
这种写法常见但容易出错:
$new = [];
foreach ($old as $v) {
$new[] = $v; // 看似能重索引
}
问题在于:
- 如果
$old是关联数组且含非顺序数字键(如[5 => 'x', 10 => 'y']),$new[]确实生成0,1,但它绕过了 PHP 对键名的内部校验逻辑 - 性能略差(多一次循环 + 分配),不如
array_values()底层 C 实现高效 - 语义模糊:读者无法一眼判断你是否真需要“丢弃所有键”,还是只是忘了写键名
除非你在做条件过滤(如只保留某些值),否则直接用 array_values() 更清晰、更可靠。
usort()、rsort() 等排序函数会重索引吗
会,而且是强制的:
-
usort()、rsort()、sort()都会**完全丢弃原键名**,生成0开始的数字索引 - 即使原数组是
['id' => 123, 'name' => 'foo'],排序后也变成[0 => 'foo', 1 => 123](按值排序) - 如果你需要保持键值关联(比如按值排序但还要知道哪个
id对应哪个name),该用asort()、uasort()、arsort()
所以排序后若还需数字索引连续性,不用额外调 array_values() —— 它已经做了。但要注意:这属于“副作用”,不是设计目标,别依赖它来“修复”索引。
array_values() 是唯一专为此目的设计的函数,其他操作只是附带效果。用错场景(比如对关联数组盲目重索引)会导致键信息永久丢失。



















