PHP array_keys() 函数(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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() 支持三个参数,其中第二个和第三个参数是可选的:

  1. $array:必填,要操作的目标数组。
  2. $search_value:可选,指定要筛选的值。
  3. $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 数组键名提取

最新发布