array_values()是最快重置php数组数字索引的方式,丢弃所有原始键、返回0起始的连续整数索引数组,适用于各类数组且不修改原数组;需赋值回变量,保留特定键时应改用array_filter()配合遍历重建。

用 array_values() 最快重置索引
PHP 数组键名丢失或错乱后,想让数字索引从 0 连续递增,array_values() 是最直接、开销最小的方式。它只保留值,丢弃所有原始键,返回一个以 0 开始的连续整数索引数组。
常见错误现象:unset($arr[1]) 后直接 foreach,结果键还是 0,2,3;或者用 array_merge($arr) 想“重排”,但对关联数组无效(只对数字键起作用,且写法冗余)。
-
array_values()对所有类型数组都安全:数字索引、关联、混合型都可处理 - 不改变原数组,必须赋值回变量:
$arr = array_values($arr); - 性能上几乎无额外开销,底层是 C 实现,比手动
foreach + array_push快得多
需要保留部分键时别用 array_values()
如果只是想清理“空洞”但又希望某些键(比如字符串键)保留下来,array_values() 就不合适了——它会把所有键都干掉。
此时得用 array_filter() 配合 array_values() 或手动重建:
- 先过滤掉空值或无效项:
$filtered = array_filter($arr, function($v) { return $v !== null && $v !== ''; }); - 再重索引:
$reindexed = array_values($filtered); - 若要保留非空字符串键(如
'name' => 'foo'),就不能用array_values(),而应遍历重建:$new = []; foreach ($arr as $k => $v) { if ($v !== null) $new[$k] = $v; }
array_merge() 也能重索引?但有陷阱
对纯数字索引数组,array_merge($arr) 看似能重排,因为它的行为是“合并所有值并重新编号”。但它本质是为合并设计的,不是重索引工具。
- 遇到字符串键,
array_merge()会保留它们,不重排——和预期不符 - 如果数组里有
null或false,array_merge()不过滤,而array_filter()默认会删掉这些“falsy”值(需显式传回调避免) - PHP 8.2+ 中,
array_merge(null)会报TypeError,而array_values(null)返回空数组,更健壮
JSON 场景下注意键类型转换
从 json_decode($json, true) 得到的数组,键总是字符串(即使 JSON 里是数字),array_values() 仍有效,但要注意:它不会把字符串数字键转成整数键——它只管“值”,不管原始键类型。
例如:json_decode('{"0":"a","2":"b"}', true) 返回 ['0'=>'a','2'=>'b'],array_values() 后是 [0=>'a',1=>'b'],不是 [0=>'a',2=>'b']。
如果原始 JSON 键顺序重要,且你依赖数字键语义(比如前端 expect index 0/1/2),那这个转换就是你想要的;但如果业务逻辑依赖键名本身(比如映射数据库字段名),就别动键。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











