array_values()是最直接解法,因其专为丢弃原键、生成连续整数键数组而设计;手动循环或array_merge()均低效或易误导,且对非数字键关联数组需谨慎判断需求。

为什么 array_values() 是最直接的解法
PHP 数组键名不连续时(比如用 unset() 删除过元素),下标会残留空缺,导致 foreach 看不出问题,但 for 循环或 json_encode() 输出时暴露为关联数组。重建连续数字下标本质就是「重排键名」,array_values() 正是为此设计:它丢弃原键,返回仅含顺序整数键的新数组。
常见错误是手动遍历 + array_push() 或 [] 追加,既低效又绕路。别写循环,直接调用:
$arr = ['a', 'b', 'c']; unset($arr[1]); // ['a', 'c'],键为 0 和 2 $new_arr = array_values($arr); // [0=>'a', 1=>'c']
什么时候不能只靠 array_values()
如果原数组本身是「非数字键的关联数组」,比如 ['name' => 'Alice', 'age' => 30],array_values() 会丢掉所有有意义的键名,只留值——这不是「重建下标」,而是「转成索引数组」。此时需明确目的:
- 真要连续整数键 → 用
array_values(),接受键名丢失 - 想保留键名但让键「看起来连续」→ PHP 不支持稀疏索引数组的「自动压缩」,这种需求本身不合理
- 后续要
json_encode()成紧凑数组 → 确保输入已是纯索引结构,否则输出带键名
array_merge() 能不能替代?
可以,但没必要。对纯索引数组,array_merge($arr) 会重置键名,效果和 array_values() 一样。但它有隐藏风险:
立即学习“PHP免费学习笔记(深入)”;
- 若 $arr 是关联数组,
array_merge()仍会重排键,但语义上它本意是「合并」,容易误导维护者 - 传入非数组类型会警告,而
array_values()对非数组返回空数组,更安全 - 性能略差,内部多一层合并逻辑
结论:用 array_values(),别用 array_merge() 做这事。
重建后要注意 JSON 和 foreach 的行为差异
连续下标数组 json_encode() 输出为 [...](JSON 数组),非连续或含字符串键则输出为 {...}(JSON 对象)。这点在 API 返回、前端解析时极易出错。
另外,foreach 不关心键是否连续,它按内部指针顺序遍历;但如果你用 for ($i = 0; $i ,下标不连续会导致跳过或报错(<code>Undefined offset)。
所以重建下标不是为了 foreach,而是为了:for 循环、array_keys($arr) 取键、json_encode() 格式、或第三方库要求纯索引输入。



















