array_values仅提取数组值并重排为连续数字索引,不修改原数组、不过滤去重、不支持回调转换;传入非数组触发警告,空数组返回空数组,多维数组仅处理外层。

array_values 会丢掉原数组的键名,只保留值并重排索引
它不修改原数组,而是返回一个新数组。常见于你拿到一个关联数组(比如数据库查询结果、$_POST 或 json_decode($json, true) 的结果),但后续只想按顺序处理所有值,不管键是什么。
典型错误是以为它能“过滤”或“去重”,其实它只是“取值+重编号”。如果原数组有字符串键或空洞数字键(比如 [0 => 'a', 2 => 'c']),array_values 会把它们全变成从 0 开始的连续整数索引。
- 输入非数组(如
null、字符串、对象)会触发警告:Warning: array_values() expects parameter 1 to be array, string given - 传入空数组
[]返回空数组[],不是false或null - 对多维数组也有效,但只扁平化最外层——内部子数组仍保持原样
和 array_keys、array_values 配合用才能还原“键值对映射”
如果你用 array_values 提取了值,又想回头查某个值原来对应哪个键,单靠它做不到。必须配合 array_keys 才行。
比如你想找出所有值为 "active" 的键:
$data = ['user1' => 'active', 'user2' => 'inactive', 'user3' => 'active']; $keys = array_keys($data, 'active'); // ['user1', 'user3'] $values = array_values($data); // ['active', 'inactive', 'active']
-
array_keys($arr, $search_value)才是找键的正确方式,别指望array_values反向查 - 如果只要值、完全不需要键(比如丢给
foreach ($values as $v)纯遍历),array_values就够用 - 注意:PHP 7.4+ 支持箭头函数,但
array_values本身不接受回调,不能边取值边转换
替代方案:用 foreach + array_push 更灵活,但性能略低
当你要的不只是“取值”,还要同时做转换(比如转小写、截取、类型强制),直接用 array_values 就不够了,得手动遍历。
例如把所有值转成小写再重排索引:
$arr = ['Name' => 'Alice', 'CITY' => 'BEIJING'];
$values = [];
foreach ($arr as $v) {
$values[] = strtolower($v);
}
// $values === ['alice', 'beijing'],等价于 array_values 之后再 map
-
array_values是纯搬运工,不做任何转换;想加工就得自己循环或用array_map+array_values组合 - 大数据量时,
array_values比手写foreach略快,因为它是 C 实现的内置函数 - 如果原数组已经是连续数字索引(如
[1, 2, 3]),调用array_values是冗余操作,结果一模一样
常见误用:把它当 array_unique 或 array_filter 用
有人看到“值”就以为能去重或筛选,结果发现没效果。这是根本性误解。
对比一下:
-
array_values($arr)→ 只重排索引,值一个不少 -
array_unique($arr)→ 去重,但保留原始键名(需再套一层array_values才能重排) -
array_filter($arr)→ 按条件删元素,也保留原键名(同样常跟array_values连用)
所以真要“去重+重排”,得写成:array_values(array_unique($arr));要“过滤+重排”,得写成:array_values(array_filter($arr, $callback))。
最容易被忽略的是:array_filter 默认会过滤掉所有“falsy”值(0、""、null、false),如果业务里 0 是合法值,必须显式传第三个参数 ARRAY_FILTER_USE_BOTH 并自己判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











