array_values() 的设计目标是丢弃原始键名、仅返回值并重新索引为连续数字数组,这是其核心契约而非副作用;它不修复索引也不保留键,适用于需纯数值索引的场景,但会破坏原始键关联。

array_values() 的设计目标就是丢键名
它不是“出错了才丢”,而是函数契约本身:只返回值,不保留任何键。PHP 官方文档明确写的是“array_values() returns all the values from the input array and re-indexes the array numerically, starting from zero”。也就是说,丢键名不是副作用,是核心行为。
常见误解是把它当成“修复数组索引”的工具,但其实它根本不管原始键是否合理——哪怕你传入一个干净的 [0 => 'a', 1 => 'b'],它照样新建一个数组,把值拷过去,再从 0 开始编号。
为什么不能保留原始键名?
因为它的语义是“提取所有值”,不是“重排键名”。保留键名会违背这个前提:
- 关联数组(如
['name' => 'Tom', 'age' => 25])没有数字索引,无法“保持顺序+保留键”又满足“连续整数索引”要求 - 稀疏数组(如
[5 => 'x', 10 => 'y'])若保留键,结果就不是“索引数组”,和函数声明的返回类型矛盾 - 混合键数组(如
['a' => 1, 2 => 3, 'b' => 4])更无统一规则可循
所以 PHP 选择最无歧义的做法:一律丢弃,只留值,再统一分配 0, 1, 2...。
想保留键名但又要按指定顺序取值?别用 array_values()
典型场景:前端拖拽排序后传回 ["2", "0", "1"],你要按这个顺序取出原数组对应键的元素,且必须保留 '2'、'0' 这些原始键名——这时用 array_values() 就直接废掉键了。
正确做法是:
- 用
array_flip($sortOrder)把排序列表转成键集合 - 再用
array_intersect_key($original, ...)精准筛选并保持原始键与顺序 - 例如:
$sorted = array_intersect_key($original, array_flip($sortOrder));
这行代码不重建索引、不丢键、不改变值,只做一次键匹配,底层用 C 实现,比手写 foreach 更快也更安全。
容易忽略的关键点
很多人在调用 array_values() 前没意识到:它返回的是全新数组,原数组完全不变;但如果你之后还依赖原始键做后续逻辑(比如用 array_key_exists() 查某个字符串键),那这个“丢键”动作就可能引发静默错误——值还在,但键已经找不到了。
尤其在处理用户输入或 API 返回的混合结构时,建议先用 var_dump(array_keys($arr)) 看一眼键类型,再决定要不要用 array_values()。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











