李涛自留地
回到顶部
首页 > php学习 > PHP array_keys() 函数详解:获取数组键名的 N 种姿势

PHP array_keys() 函数详解:获取数组键名的 N 种姿势

文章目录

写 PHP 数组处理代码时,经常需要拿到数组的所有键名(key)。比如遍历一个关联数组,或者用 array_combine 重新组合数组。以前我总是一手 for 循环手写 key 提取,后来发现 PHP 原生就有array_keys() 函数,一行搞定。

这篇文章把array_keys()的用法、技巧、踩过的坑都整理出来。

array_keys()基本用法

最基础的用法:直接传入数组,返回所有键名组成的索引数组。

$user = [
    'name' => '张三',
    'email' => 'zhangsan@example.com',
    'age' => 28,
    'city' => '北京',
];

// 获取所有键名
$keys = array_keys($user);
print_r($keys);
/*
输出:
---
Array
(
    [0] => name
    [1] => email
    [2] => age
    [3] => city
)
*/
?>

指定搜索值,获取匹配键名

这是array_keys()最有用的功能——传入第二个参数 $search_value,它会返回所有值等于该键名的键。

<?php
$products = [
    'A001' => '苹果',
    'B002' => '香蕉',
    'A003' => '橙子',
    'C004' => '西瓜',
];

// 想找所有 'A' 开头的商品ID
$keys = array_keys($products, 'A');
print_r($keys);
// 输出: Array([0] => A001, [1] => A003)

// 注意:array_keys 是严格匹配,'A' 不等于 '苹果'
$keys2 = array_keys($products, '苹果');
print_r($keys2);
// 输出: Array([0] => A001)
?>

严格匹配模式(第三个参数 $strict)

默认情况下 array_keys 使用松散比较(==)。如果需要严格类型匹配(===),传入第三个参数 true。

$data = [
    'zero' => 0,
    'empty' => '',
    'false' => false,
    'null' => null,
];

// 松散匹配:0 匹配到 '' 和 false(因为 == 时相等)
$loose = array_keys($data, 0);
print_r($loose);  // [zero, empty, false]

// 严格匹配:0 只匹配到整数 0
$strict = array_keys($data, 0, true);
print_r($strict);  // [zero]
?>

这个坑踩过一次就记住了:之前写用户权限检查,用 array_keys 搜索 0(表示无权限),结果把空字符串和 false 也匹配上了,导致权限判断出错。后来改成严格匹配才修好。

数组键名去重

当数组中有重复值时,array_keys 返回的键名数组也可能有重复。用 array_unique 去重:

// 假设一个标签-文章映射表
$tags = [
    'php' => 1001,
    'python' => 1002,
    'php' => 1003,  // 重复键,后面会覆盖
    'web' => 1001,  // 相同值
];

// 拿到所有值为 1001 的键
$keys = array_keys($tags, 1001);
print_r($keys);  // [php, web]
?>

实战场景

场景1:动态提取字段名

从数据库查出一批数据,动态提取需要的字段名:

// 模拟数据库查询结果
$records = [
    ['id' => 1, 'name' => '张三', 'score' => 95],
    ['id' => 2, 'name' => '李四', 'score' => 87],
    ['id' => 3, 'name' => '王五', 'score' => 76],
];

// 取第一行的键名作为字段名
$headers = array_keys($records[0]);
print_r($headers);
// [id, name, score]
// 可以用这些 headers 生成表格列头
?>

场景2:获取配置文件的键名列表

读取一个配置数组,列出所有可配置的选项:

<?php
$config = [
    'site_name' => '我的网站',
    'site_url' => 'https://example.com',
    'timezone' => 'Asia/Shanghai',
    'debug' => true,
];

// 生成配置项下拉选择框
foreach (array_keys($config) as $key) {
    echo "<option value='$key'>$key</option>\n";
}
?>

场景3:数组键名交集与差集

比较两个数组的键名差异:

<?php
// 旧版配置
$old_config = [
    'name' => 'old',
    'email' => 'old@example.com',
    'phone' => '123456',
];

// 新版配置
$new_config = [
    'name' => 'new',
    'email' => 'new@example.com',
    'address' => '北京',
];

// 找出新增的键
$old_keys = array_keys($old_config);
$new_keys = array_keys($new_config);
$new_fields = array_diff($new_keys, $old_keys);
$removed_fields = array_diff($old_keys, $new_keys);

echo '新增字段: ' . implode(', ', $new_fields) . "\n";
echo '移除字段: ' . implode(', ', $removed_fields) . "\n";
// 新增字段: address
// 移除字段: phone
?>

常见误区

误区1:array_keys 返回的是关联数组

array_keys 返回的永远是索引数组,键名从 0 开始递增,不是原来的键名:

<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
$keys = array_keys($arr);
print_r($keys);
// Array([0] => a, [1] => b, [2] => c)
// 注意键是 0,1,2 不是 a,b,c
?>

误区2:空数组返回值

如果搜索值在数组中不存在,array_keys 返回空数组 [],不会报错:

<?php
$arr = ['name' => '张三'];
$result = array_keys($arr, '不存在');
var_dump($result);  // array(0) {}
?>

相关函数对比

函数作用返回值

array_keys()获取键名键名组成的索引数组
array_values()获取值值组成的索引数组(重置键名)
array_combine()合并键和值用数组A做键、数组B做值组合成新数组
array_flip()翻转键值键变成值,值变成键

array_keys()看似简单,但配合搜索值参数和严格匹配模式,能解决很多数组处理问题。核心用法就记住三点:

  • 不加参数:获取所有键名

  • 加搜索值:找出匹配值的键名

  • 加第三个参数 true:严格类型匹配

下次遇到需要提取数组键名的场景,先用 array_keys 试试,比写循环效率高多了。

若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。