在 PHP 编程中,数组是最常用的数据结构之一。关联数组能够以键值对的形式表达用户信息、配置项、表单数据等,因此在实际开发中经常需要单独取出数组中的所有键名,或者取出数组中的所有值。手动使用 foreach 循环逐个处理当然可行,但 PHP 已经提供了 array_keys 和 array_values 两个内置函数,可以直接完成提取操作,使代码更简洁,也更符合数组处理的常规写法。

array_keys 的核心用法:提取键名与按值筛选
array_keys 函数的主要作用是返回一个由原数组键名组成的新数组。它不会修改原数组,而是将键名按原数组中的出现顺序放入新的索引数组中,新数组的索引从 0 开始依次递增。对于字符串键名、数字键名以及混合键名,array_keys 都可以正确处理。理解这一点很重要,因为很多开发者会把键名和值混淆,而 array_keys 只关心键,不关心对应的值。
从参数设计上看,array_keys 至少需要一个数组参数。第二个参数用于指定要查找的值,只有当数组元素值与该参数匹配时,对应键名才会被返回。第三个参数用于控制是否启用严格比较。省略第二个参数时,函数返回全部键名;显式传入某个值时,函数则变成按值筛选键名。这种设计让同一个函数既能做全量提取,也能做条件筛选。
获取全部键名
<?php
// array_keys(array $array, mixed $search_value = null, bool $strict = false): array
$user = [
'name' => '张三',
'age' => 25,
'city' => '北京'
];
$keys = array_keys($user);
print_r($keys);
// 输出:Array ( [0] => name [1] => age [2] => city )
?>
上面的示例中,原数组包含 name、age、city 三个键。调用 array_keys 后,返回结果是一个索引数组,其中 0 对应 name,1 对应 age,2 对应 city。原数组仍然保留键值对应关系,而新数组只保存键名。这样的结果非常适合用于打印字段名、生成表单字段列表或做后续集合运算。
按指定值筛选键名
<?php
$score = [
'语文' => 90,
'数学' => 85,
'英语' => 90,
'物理' => 88
];
$keys = array_keys($score, 90);
print_r($keys);
// 输出:Array ( [0] => 语文 [1] => 英语 )
?>
当需要找出哪些键对应的值等于某个目标值时,可以传入第二个参数。示例中语文和英语的分数都是 90,因此返回这两个科目名称。这个能力在处理成绩统计、状态筛选、标签反查等场景时很实用。需要注意的是,筛选结果只包含键名,不包含值本身,如果需要值,仍应回到原数组中读取。
严格比较与 null 值
<?php
$data = [
'a' => 1,
'b' => '1',
'remark' => null,
'name' => '李四'
];
$looseKeys = array_keys($data, 1);
$strictKeys = array_keys($data, 1, true);
$strictNullKeys = array_keys($data, null, true);
print_r($looseKeys);
// 输出:Array ( [0] => a [1] => b )
print_r($strictKeys);
// 输出:Array ( [0] => a )
print_r($strictNullKeys);
// 输出:Array ( [0] => remark )
?>
在非严格模式下,PHP 的类型转换会让 1 和 '1' 被视为相等,因此两个键都会被返回;启用严格模式后,只有类型和值都一致的键才会被匹配。对于 null 值,显式传入 null 时会匹配数组中的 null 值,而不是返回全部键名。如果业务上需要准确判断某个键的值是否为 null,建议结合严格模式使用,避免空字符串、0、false 等值在宽松比较中产生干扰。
array_values 的核心用法:抽取值并重建连续索引
array_values 函数的作用与 array_keys 相反,它返回原数组中的所有值,并重新建立一套从 0 开始的连续数字索引。原数组中的键名会被丢弃,值会按照原有顺序依次放入新数组。由于返回结果一定是索引数组,因此非常适合用于只需要值、不需要键名的场景,例如批量展示、批量更新、批量导出等。
在实际项目中,数组索引不连续是很常见的情况。比如删除了某个元素、过滤掉了部分数据、或者从外部系统接收到带有自定义键名的数组后,后续逻辑如果依赖 0、1、2 这样的连续索引,就容易出现问题。array_values 可以快速重建索引,使数组恢复为标准的索引数组,减少手动循环重置索引的麻烦。
基本抽取值
<?php
$user = [
'name' => '张三',
'age' => 25,
'city' => '北京'
];
$values = array_values($user);
print_r($values);
// 输出:Array ( [0] => 张三 [1] => 25 [2] => 北京 )
?>
示例中,原数组是关联数组,包含姓名、年龄和城市三个键值对。调用 array_values 后,返回结果只保留值,并且索引重新从 0 开始。原数组中的 name、age、city 这些键名不再出现在结果中。如果只需要把数组内容作为纯数据列表处理,这种写法比手动循环更直接。
重置索引
<?php $list = [0 => 'a', 1 => 'b', 2 => 'c']; unset($list[1]); print_r($list); // 输出:Array ( [0] => a [2] => c ) $reindexed = array_values($list); print_r($reindexed); // 输出:Array ( [0] => a [1] => c ) ?>
删除索引 1 的元素后,数组只剩下 0 和 2 两个索引,中间出现了空缺。经过 array_values 处理后,索引重新变为 0 和 1。这个操作不会改变值的顺序,也不会修改原数组,只是生成一个新的连续索引数组。对于需要传给前端、写入数据库或进行遍历下标访问的数据,重建索引往往是一个必要步骤。
两个函数的差异对比
| 函数 | 返回值 | 常见用途 |
|---|---|---|
array_keys | 键名组成的索引数组 | 提取字段名、按值筛选键名 |
array_values | 值组成且索引从0开始的数组 | 抽取值、重置连续索引 |
从对比表中可以看出,两个函数虽然都返回新数组,但返回内容完全不同。array_keys 返回的是键名,array_values 返回的是值;array_keys 支持按值筛选,array_values 则专注于值提取和索引重建。理解这种差异,可以在开发时快速选择合适的函数,避免写出不必要的循环代码。
组合使用与开发场景:字段校验和结果处理
在真实业务中,array_keys 和 array_values 往往不会孤立使用,而是和其他数组函数组合起来完成更复杂的逻辑。例如处理用户提交的表单时,后端通常需要校验提交字段是否都在允许范围内。此时可以先用 array_keys 取出所有提交字段,再与白名单字段做差集,从而找出多余字段。这种方式逻辑清晰,也便于维护。
<?php
$allowFields = ['username', 'password', 'email', 'phone'];
$postData = [
'username' => 'test',
'password' => '123456',
'age' => 20
];
$postKeys = array_keys($postData);
$extraFields = array_diff($postKeys, $allowFields);
if (!empty($extraFields)) {
echo '提交的字段中存在不允许的字段:' . implode(',', $extraFields);
} else {
echo '字段校验通过';
}
?>
示例中,允许字段包括 username、password、email、phone,而用户额外提交了 age 字段。array_keys 取出提交字段后,array_diff 计算出多出的字段,最终输出提示信息。如果提交字段全部合法,则输出校验通过。这个例子展示了从键名提取到集合比较的完整流程,也说明 array_keys 在安全校验类场景中具有重要价值。
使用注意事项
- 两个函数都返回新数组,不会修改原数组,因此可以放心用于中间处理。
- 如果输入是空数组,两个函数都会返回空数组,通常可以安全使用。
array_keys的筛选结果依赖比较规则,涉及数字、字符串、null等类型时,建议明确是否使用严格模式。array_values返回的索引一定是从 0 开始的连续数字索引,适合用于需要标准索引数组的后续处理。
总体来看,array_keys 和 array_values 是 PHP 数组处理中非常实用的两个函数。前者负责把键名独立出来,后者负责把值独立出来并重建索引。掌握它们的基本语法、筛选参数、严格比较方式以及组合用法,可以帮助开发者减少重复循环,提高代码可读性,也能在表单校验、数据清洗、结果输出等场景中写出更稳定的数组处理逻辑。
phparray_keysarray_values数组键值获取修改时间:2026-07-12 12:30:24