李涛自留地
回到顶部
首页 > php学习 > PHP array_flip() 和 array_key_exists() 详解:反转键值与键名判断

PHP array_flip() 和 array_key_exists() 详解:反转键值与键名判断

文章目录

最近写权限检查函数时,需要频繁判断一个 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));
?>

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