PHP array_flip() 和 array_key_exists() 详解:反转键值与键名判断
- 2026年7月3日
- 149 次
最近写权限检查函数时,需要频繁判断一个 ID 是否在允许列表中。用 in_array($id, $arr) 查了老半天,后来发现把数组反转后,array_key_exists() 的性能高出几个数量级。
这篇文章聊聊array_flip()和 array_key_exists() 的配合使用,以及常见坑。
array_flip()反转数组
array_flip()- 交换数组的键和值。注意:值必须是可以作为有效键名的类型(字符串或整数),重复的值会被后面的覆盖。
'#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。
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 array_slice() 和 array_splice() 详解:数组切片与截取
- 下一篇: PHP array_rand()、array_sum()、array_product() 常用聚合函数
- PHP array_slice() 和 array_splice() 详解:数组切片与截取 2026-07-02
- wordpress的robots.txt在哪儿?wordpress修改robots文件的方法 2022-09-22
- PHP如何读取文件?PHP简单读取文件函数及实例 2022-11-07
- PHP数组常用函数之删除新增元素的函数用法及实例代码 2022-10-25
- PHP使用imagecreatetruecolor函数颜色一直为黑色怎么办?PHP创建真彩色图像为黑色怎么办? 2022-11-27
- PHP数组去重函数array_unique()怎么用 PHP数组去重函数使用实例 2022-11-14
