PHP array_keys() 函数(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 PHP 开发中,数组(array)是处理数据的核心工具之一。无论是处理表单提交、数据库查询结果,还是构建复杂的业务逻辑,开发者经常需要快速获取数组的键(key)信息。此时,array_keys()
函数便成为不可或缺的工具。它不仅能提取数组的所有键名,还能根据条件筛选出符合条件的键,甚至与其他函数结合实现更复杂的功能。
本文将从基础到进阶,结合实际案例,深入讲解 PHP array_keys() 函数
的用法、原理和应用场景,帮助开发者高效掌握这一实用工具。
一、基础概念:数组的键与值
1.1 数组的结构
PHP 中的数组由键(key)和值(value)组成。键可以是数字或字符串,值可以是任意类型的数据。例如:
$book = [
'title' => 'PHP 教程',
'author' => 'John Doe',
'year' => 2023
];
在这个数组中,'title'
、'author'
、'year'
是键,对应的值分别是 'PHP 教程'
、'John Doe'
和 2023
。
1.2 array_keys() 的核心功能
array_keys()
函数的作用是提取数组中所有键名,并返回一个新的数组。其语法如下:
array array_keys(array $array, mixed $search_value = ?, bool $strict = ?)
- 基础用法:
$keys = array_keys($book); print_r($keys); // 输出:Array ( [0] => title [1] => author [2] => year )
这里,
array_keys()
将原数组的键名提取出来,并以数字索引数组的形式返回。
二、array_keys() 的进阶用法
2.1 参数详解
array_keys()
支持三个参数,其中第二个和第三个参数是可选的:
- $array:必填,要操作的目标数组。
- $search_value:可选,指定要筛选的值。
- $strict:可选,布尔值,控制是否严格比较(类型和值都相同)。
2.1.1 根据值筛选键名
当需要获取特定值对应的键名时,可以传入 $search_value
:
$fruits = [
'apple' => 'red',
'banana' => 'yellow',
'grape' => 'purple',
'kiwi' => 'green'
];
// 查找值为 'yellow' 的键
$keys = array_keys($fruits, 'yellow');
print_r($keys); // 输出:Array ( [0] => banana )
若存在多个符合条件的键,函数会返回所有匹配项:
$fruits = [
'apple' => 'red',
'cherry' => 'red'
];
$keys = array_keys($fruits, 'red');
print_r($keys); // 输出:Array ( [0] => apple [1] => cherry )
2.1.2 严格比较($strict 参数)
默认情况下,array_keys()
使用松散比较(==
)。若需严格匹配值和类型的组合,可设置 $strict = true
:
$values = [
0 => '0', // 字符串 '0'
1 => 0 // 整数 0
];
// 松散比较:0 和 '0' 视为相等
$keys = array_keys($values, 0);
print_r($keys); // 输出:Array ( [0] => 0 [1] => 1 )
// 严格比较:仅匹配类型和值完全相同的项
$strict_keys = array_keys($values, 0, true);
print_r($strict_keys); // 输出:Array ( [0] => 1 )
三、实战案例:array_keys() 的应用场景
3.1 案例 1:处理表单数据
假设用户提交了一个表单,其中某些字段可能为空。可以使用 array_keys()
快速筛选出非空的字段名:
// 模拟表单数据
$form_data = [
'name' => 'Alice',
'email' => '',
'age' => 25,
'message' => ''
];
// 获取非空字段的键名
$non_empty_keys = array_keys($form_data, '', true);
$valid_fields = array_diff_key($form_data, array_flip($non_empty_keys));
print_r($valid_fields);
// 输出:Array ( [name] => Alice [age] => 25 )
通过结合 array_flip()
和 array_diff_key()
,可实现保留非空字段的功能。
3.2 案例 2:重置数组索引
当数组的键名被修改或存在间隙时,可使用 array_keys()
结合 array_values()
重置索引:
$numbers = [10, 20, 30];
unset($numbers[1]); // 删除键 1
// 重置索引
$reset = array_values($numbers);
print_r($reset); // 输出:Array ( [0] => 10 [1] => 30 )
这里,array_values()
会返回原数组的值,并自动以数字索引重新排列。
3.3 案例 3:统计特定值的出现次数
虽然 PHP 提供了 array_count_values()
函数,但结合 array_keys()
可实现更灵活的统计:
$scores = ['A', 'B', 'A', 'C', 'B', 'A'];
// 统计每个值的出现次数
$counts = array_count_values($scores);
print_r($counts); // 输出:Array ( [A] => 3 [B] => 2 [C] => 1 )
// 或者通过 array_keys() 实现
$unique_values = array_unique($scores);
foreach ($unique_values as $value) {
$count[$value] = count(array_keys($scores, $value));
}
print_r($count); // 结果与 array_count_values 相同
四、与类似函数的对比
4.1 array_keys() vs. array_values()
- array_keys():返回所有键名组成的数组。
- array_values():返回所有值组成的数组,并重置数字索引。
示例:
$array = ['a' => 1, 'b' => 2];
// array_keys()
print_r(array_keys($array)); // 输出:Array ( [0] => a [1] => b )
// array_values()
print_r(array_values($array)); // 输出:Array ( [0] => 1 [1] => 2 )
4.2 array_keys() vs. array_flip()
- array_flip():将数组的键和值互换。
- array_keys():仅提取键名,不涉及值的转换。
示例:
$array = ['a' => 1, 'b' => 2];
// array_flip()
print_r(array_flip($array)); // 输出:Array ( [1] => a [2] => b )
// array_keys()
print_r(array_keys($array)); // 输出:Array ( [0] => a [1] => b )
五、性能优化与注意事项
5.1 性能考量
array_keys()
是 PHP 内置的高效函数,其时间复杂度为 O(n)(n 为数组长度)。但在处理超大数组时,仍需注意内存消耗。
5.2 嵌套数组的处理
对于多维数组,array_keys()
仅提取第一层的键名。若需递归处理,需手动遍历:
$nested_array = [
'fruits' => ['apple', 'banana'],
'vegetables' => ['carrot', 'potato']
];
// 提取第一层键
$keys = array_keys($nested_array);
print_r($keys); // 输出:Array ( [0] => fruits [1] => vegetables )
六、扩展应用:结合其他函数
6.1 结合 array_filter() 过滤键
通过 array_filter()
和 array_keys()
结合,可实现按条件筛选键:
$products = [
'phone' => 599,
'laptop' => 1299,
'tablet' => 899
];
// 筛选价格 > 1000 的键
$expensive_keys = array_keys(
array_filter($products, function($price) { return $price > 1000; })
);
print_r($expensive_keys); // 输出:Array ( [0] => laptop )
6.2 生成键名的映射表
在需要将键名映射为其他形式时,可结合 array_combine()
:
$original = ['name', 'email', 'age'];
$new_keys = array_keys($original); // 原数组的键(可能为数字索引)
$new_values = ['full_name', 'email_address', 'age_years'];
// 生成新的键值对
$result = array_combine($new_keys, $new_values);
print_r($result); // 输出:Array ( [0] => full_name [1] => email_address [2] => age_years )
结论
PHP array_keys() 函数
是数组操作中的“瑞士军刀”,其功能远不止于提取键名。通过灵活运用参数和与其他函数的结合,开发者可以高效完成数据筛选、结构转换等任务。无论是处理表单、分析数据,还是优化代码逻辑,掌握这一函数都能显著提升开发效率。
建议读者通过实际项目中的案例反复练习,并结合官方文档(PHP array_keys() 文档 )深入理解细节。随着对数组函数的熟悉,你将更从容地应对复杂的数据处理场景。
关键词布局:PHP array_keys() 函数、array_keys() 参数、array_keys() 实例、PHP 数组键名提取