PHP in_array()、array_search()、array_key_exists() 查找函数对比
- 2026年7月3日
- 138 次
文章目录
最近写权限检查函数时,需要频繁判断一个 ID 是否在允许列表中。用 in_array($id, $arr) 查了老半天,后来发现把数组反转后,array_key_exists() 的性能高出几个数量级。
这篇文章聊聊array_flip()和 array_key_exists() 的配合使用,以及常见坑。
array_flip()反转数组
array_flip()- 交换数组的键和值。注意:值必须是可以作为有效键名的类型(字符串或整数),重复的值会被后面的覆盖。
<?php
$colors = ['red' => '#FF0000', 'green' => '#00FF00', 'blue' => '#0000FF'];
$flip = array_flip($colors);
print_r($flip);
// Array ( [#FF0000] => red [#00FF00] => green [#0000FF] => blue )
?>
array_key_exists() 判断键名
array_key_exists(key, array) - 判断数组中是否存在指定的键名。isset() 也可以判断,但 isset() 对值为 null 的键返回 false,array_key_exists() 返回 true。
<?php
$data = ['a' => 1, 'b' => null, 'c' => 0];
var_dump(array_key_exists('b', $data)); // true
var_dump(isset($data['b'])); // false
var_dump(array_key_exists('d', $data)); // false
?>
性能优化:反转数组做查找
这是最实用的技巧。判断某个值是否在数组中,反转数组后用 array_key_exists() 查找,比 in_array() 快很多。
<?php
$allowed = [1001, 1002, 1003, 1004, 1005];
$lookup = array_flip($allowed);
function hasPermission($uid, $lookup) {
return array_key_exists($uid, $lookup);
}
// 比 in_array($uid, $allowed) 快10倍以上
?>
性能对比
方法时间复杂度适用场景
in_array($val, $arr)O(n)偶尔查找
array_key_exists($val, array_flip($arr))O(1) 查找频繁查找
实战场景
场景1:权限检查
<?php
class PermissionChecker {
private $roles;
public function __construct(array $roleIds) {
$this->roles = array_flip($roleIds);
}
public function check($roleId) {
return array_key_exists($roleId, $this->roles);
}
}
$checker = new PermissionChecker([1, 3, 5, 7, 9]);
$checker->check(5); // true
$checker->check(4); // false
?>
场景2:状态映射
<?php
$statusNames = [1 => '待审核', 2 => '已通过', 3 => '已拒绝', 4 => '已取消'];
$statusLookup = array_flip($statusNames);
echo $statusLookup['已拒绝']; // 3
?>
场景3:去重
<?php
$tags = ['php', 'php', 'javascript', 'php', 'python'];
$unique2 = array_flip(array_flip($tags));
?>
<?php
class PermissionChecker {
private $roles;
public function __construct(array $roleIds) {
$this->roles = array_flip($roleIds);
}
public function check($roleId) {
return array_key_exists($roleId, $this->roles);
}
}
$checker = new PermissionChecker([1, 3, 5, 7, 9]);
$checker->check(5); // true
$checker->check(4); // false
?>
<?php
$statusNames = [1 => '待审核', 2 => '已通过', 3 => '已拒绝', 4 => '已取消'];
$statusLookup = array_flip($statusNames);
echo $statusLookup['已拒绝']; // 3
?>
场景3:去重
<?php
$tags = ['php', 'php', 'javascript', 'php', 'python'];
$unique2 = array_flip(array_flip($tags));
?>
<?php
$tags = ['php', 'php', 'javascript', 'php', 'python'];
$unique2 = array_flip(array_flip($tags));
?>
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- PHP面向对象接口如何使用 接口与抽象类的相同之处和区别 2022-12-11
- PHP日期函数mktime()如何使用 PHP时间函数mktime()实例代码 2022-10-15
- 使用Css3的transition和transform属性实现图片动态翻转效果实例 2022-05-06
- PHP自定义函数变量作用域用法解析 2022-10-07
- PHP对象类型如何检测?PHP如何检测对象属于那个类? 2022-12-12
- 后缀为.md文件用什么打开? 后缀为md文件怎么打开? 2022-12-20
