PHP 数组查找函数 in_array()、array_search()、array_keys() 实战对比
- 2026年7月3日
- 106 次
文章目录
最近写权限验证的时候,纠结用 in_array 还是 array_key_exists,查了半天文档才发现这俩根本不是一个东西。今天把这几个数组查找函数捋清楚。
in_array() 判断值是否存在
in_array 最常用的,判断一个值在不在数组里。
$users = ['admin', 'editor', 'viewer'];
// 判断用户角色是否存在
if (in_array($role, $users)) {
echo '角色合法';
} else {
echo '无权访问';
}
几个注意点:
- 严格模式:in_array() 默认不严格比较,
in_array('1', [1, 2])返回 true。用第三个参数 true 开启严格比较:in_array('1', [1, 2], true)返回 false。 - 性能:in_array 是 O(n) 线性扫描,数组越大越慢。大数据量建议先用 array_flip 反转再判断键。
- NULL 值:
in_array(null, $arr)会匹配数组中的所有假值(0, '', false),注意区分。
array_search() 找值的键名
和 in_array 类似,但返回的是找到的第一个匹配项的键名,找不到返回 false。
$email_map = [
'u001' => 'alice@example.com',
'u002' => 'bob@example.com',
'u003' => 'admin@example.com',
];
// 根据邮箱找用户ID
$uid = array_search('admin@example.com', $email_map);
if ($uid !== false) {
echo '管理员用户ID: ' . $uid; // 输出 u003
}
array_search 也支持严格模式,第三个参数 true 开启:
$result = array_search('1', ['1', '2', 1], true);
// 返回 '1'(字符串键),而不是 2(整数键)
array_keys() 提取所有键名
有时候你不需要判断某个值,而是要拿所有键来做遍历或检查。
$data = [
'name' => '张三',
'age' => 28,
'city' => '北京',
];
// 获取所有字段名
$fields = array_keys($data);
print_r($fields);
// Array([0] => name [1] => age [2] => city)
// 还可以指定过滤条件,只取包含特定值的键
$active_keys = array_keys($data, true);
array_key_exists() vs isset()
array_key_exists 和 isset 都能检查键是否存在,但有区别:
$arr = ['key1' => null, 'key2' => false, 'key3' => 0];
array_key_exists('key1', $arr); // true(键存在,值为null)
isset($arr['key1']); // false(值为null,isset认为不存在)
array_key_exists('key2', $arr); // true
isset($arr['key2']); // false(值为false)
array_key_exists('key3', $arr); // true
isset($arr['key3']); // false(值为0)
简单说:isset 更快但会过滤掉 null/false/0,array_key_exists 更精确。检查关联数组的键是否存在时,array_key_exists 更安全。
array_flip() + array_key_exists() 高性能查找
数组很大时 in_array 太慢,用 array_flip 反转数组再判断键名,性能提升巨大:
// 低效:O(n) 线性扫描
foreach ($data as $item) {
if (in_array($item['id'], $allowed_ids)) {
// ...
}
}
// 高效:O(1) 哈希查找
$flip = array_flip($allowed_ids);
foreach ($data as $item) {
if (array_key_exists($item['id'], $flip)) {
// ...
}
}
array_flip 时间复杂度 O(n),后续每次查找都是 O(1)。数组越大效果越明显。
对比总结
| 函数 | 作用 | 返回值 | 严格模式 |
|---|---|---|---|
| in_array() | 判断值是否存在 | true/false | 第三个参数 |
| array_search() | 查找值的键名 | 键名或false | 第三个参数 |
| array_key_exists() | 判断键是否存在 | true/false | 不适用 |
| isset() | 判断变量是否存在且非null | true/false | 不适用 |
| array_flip() | 反转键值对 | 新数组 | 不适用 |
选哪个?
- 小数组(<1000元素):in_array() 够了
- 大数组反复查找:array_flip + array_key_exists
- 需要知道匹配项在哪:array_search()
- 检查关联数组键:array_key_exists()
下期聊聊 array_keys() 的过滤用法,感兴趣的话点个关注~
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- 上一篇: PHP array_merge_recursive() 和 array_replace() 详解:数组合并与替换
- 下一篇: PHP array_multisort() 函数详解:多维数组排序的 N 种姿势
- PHP自定义函数用法解析及PHP自定义函数如何调用 2022-10-03
- PHP文件指针函数有哪些?PHP文件指针函数怎么使用? 2022-11-14
- PHP自定义函数变量作用域用法解析 2022-10-07
- html5中audio标签怎么使用?html5中audio标签使用实例 2022-11-28
- PHP中getimagesize()函数使用方法 getimagesize()函数有哪些内置参数? 2022-11-23
- WordPress代码实现文章目录功能 WordPress不用插件自动文章目录效果 2022-05-29
