李涛自留地
回到顶部
首页 > php学习 > PHP 数组查找函数 in_array()、array_search()、array_keys() 实战对比

PHP 数组查找函数 in_array()、array_search()、array_keys() 实战对比

文章目录

最近写权限验证的时候,纠结用 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() 的过滤用法,感兴趣的话点个关注~

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