PHP array_keys() 函数详解:获取数组键名的 N 种姿势
- 2026年7月3日
- 116 次
写 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 试试,比写循环效率高多了。
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- 服务器内存不足OOM killed进程?排查服务器内存不足优化实战 2026-07-02
- PHP获取PHP配置文件函数有哪些?PHP获取PHP配置文件函数怎么用? 2022-11-29
- 备案关站对于网站有影响么?如何实现不关站对网站域名进行备案? 2023-02-10
- Python安装Pillow包报错Fatal error in launcher: Unable to create process using 2022-02-21
- Linux df -h 磁盘空间满了怎么办?5分钟定位大文件并清理 2026-07-02
- Python进入help(str)帮助文档后如何回到原有代码段? 2021-07-28
