考虑以下两个例子……
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
我想知道这两种方法是否更好。我一直使用第一个例子,但在这个网站上看到很多人使用第二个例子。
那么,哪个更好呢?更快呢?清晰的意图?
考虑以下两个例子……
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
我想知道这两种方法是否更好。我一直使用第一个例子,但在这个网站上看到很多人使用第二个例子。
那么,哪个更好呢?更快呢?清晰的意图?
当前回答
显然第二个例子的意图更清楚,这是毫无疑问的。要弄清楚示例#1的作用,您需要熟悉PHP的变量初始化特性——然后您会发现它对于空值的作用是不同的,等等。
至于哪个更快——我不打算猜测——在你的PHP版本上运行数十万次,你会发现:)
其他回答
至于“更快”:尝试一下(我的钱在array_key_exists()上,但我现在不能尝试)。
至于"clear in the intent":
结合isset()和is_null()提供了最好的性能相对于其他函数:array_key_exists(), isset(), isset() + array_key_exists(), is_null(), isset() + is_null(),这里唯一的问题是函数将不仅返回false如果键不存在,但即使键存在,有一个空值。
基准脚本:
<?php
$a = array('a' => 4, 'e' => null)
$s = microtime(true);
for($i=0; $i<=100000; $i++) {
$t = (isset($a['a'])) && (is_null($a['a'])); //true
$t = (isset($a['f'])) && (is_null($a['f'])); //false
$t = (isset($a['e'])) && (is_null($a['e']));; //false
}
$e = microtime(true);
echo 'isset() + is_null() : ' , ($e-$s)."<br><br>";
?>
来源:https://web.archive.org/web/20140222232248/zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/
它和php。net是不同的
isset()不会为数组返回TRUE 对应NULL值的键, 而array_key_exists()可以。
一个非常非正式的测试显示,array_key_exists()比isset()慢2.5倍左右。
Php 7提供了使用空合并运算符的可能性。
null合并运算符(??)已被添加为语法糖,用于需要将三元值与isset()结合使用的常见情况。如果操作数存在且不为NULL,则返回第一个操作数;否则返回第二个操作数。
所以现在你可以在值为null或键不存在的情况下分配一个默认值:
$var = $array[$key] ?? 'default value'
显然第二个例子的意图更清楚,这是毫无疑问的。要弄清楚示例#1的作用,您需要熟悉PHP的变量初始化特性——然后您会发现它对于空值的作用是不同的,等等。
至于哪个更快——我不打算猜测——在你的PHP版本上运行数十万次,你会发现:)