最简单安全的方式是调用array_values(),它丢弃键名、保留值并生成从0开始的数字索引,不改变原数组,能正确处理字符串键、混合键、重复值及空数组等所有情况。

直接用 array_values() 就行
PHP 关联数组转索引数组,最简单也最安全的方式就是调用 array_values()。它会丢弃所有键名,只保留值,并按原顺序重新生成从 0 开始的数字索引。
这个函数不改变原数组,返回一个新数组,适合大多数场景。
- 原数组键名是字符串(比如
['name' => 'Alice', 'age' => 30])或混合键(比如[10 => 'a', 'x' => 'b']),array_values()都能正确处理 - 如果原数组有重复值,不会去重,只管“取值”
- 空数组、全数字键数组传进去也没问题,结果仍是索引数组
$assoc = ['a' => 1, 'b' => 2, 'c' => 3]; $indexed = array_values($assoc); // $indexed 是 [1, 2, 3],键为 0, 1, 2
别用 array_merge() 模拟,容易出错
有人会想到用 array_merge($arr) 来“重置键”,这在某些情况下确实有效,但它是靠合并单个数组触发的副作用,行为不稳定且语义不清。
真正的问题在于:当数组里有非标量值(比如对象、资源、闭包)时,array_merge() 可能抛出警告或静默失败;而 array_values() 始终只操作键值映射,不涉及值的类型判断或合并逻辑。
-
array_merge()在 PHP 8.0+ 对含非数组参数会报Warning: array_merge(): Expected parameter 1 to be an array - 如果原数组是引用传递或含不可序列化项,
array_merge()行为更难预测 -
array_values()执行更快,底层直接遍历哈希表取值,无额外拷贝或类型检查
需要保留部分键?那就手动构造
如果目标不是“全转索引”,而是“只提取某些键对应的值并排成索引数组”,就别硬套 array_values()。这时候应该先用 array_intersect_key() 或 array_keys() + array_map() 筛选,再取值。
- 例如只取
'name'和'email'字段:array_values(array_intersect_key($user, array_flip(['name', 'email']))) - 或者用
array_map()配合fn($k) => $arr[$k],但要注意键是否存在,否则会触发Notice: Undefined index - 若需去重或排序后再转索引,必须在
array_values()之前完成,它本身不做任何值处理
JSON 场景下注意键名丢失是正常行为
如果你把关联数组 json_encode() 成 JSON,再 json_decode() 回来,默认得到的是对象或索引数组(取决于第二个参数)。这不是转换失败,而是 JSON 规范本身不保留原始 PHP 键类型——字符串键在 JSON 中就是对象属性,PHP 解码时若要求关联数组,才还原为 array;否则默认是 stdClass 实例。
- 想确保解码后是索引数组?用
json_decode($json, true),但前提是原始 JSON 是数组格式([...]),不是对象格式({...}) - 从 API 接收的数据如果是
{"0":"a","1":"b"}这种伪数组,json_decode(..., true)仍会返回关联数组,得再套一层array_values() - 别依赖
json_encode()的输出结构反推 PHP 数组类型,它只反映数据形状,不保留 PHP 元信息
关键点始终是:PHP 数组的“关联”或“索引”本质由键决定,而不是值;array_values() 是唯一专为此目的设计的函数,其他方式都是绕路,还可能在边界 case 下失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











