考虑以下两个例子……
$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)) {
// ...
}
我想知道这两种方法是否更好。我一直使用第一个例子,但在这个网站上看到很多人使用第二个例子。
那么,哪个更好呢?更快呢?清晰的意图?
它和php。net是不同的
isset()不会为数组返回TRUE 对应NULL值的键, 而array_key_exists()可以。
一个非常非正式的测试显示,array_key_exists()比isset()慢2.5倍左右。
Isset()更快,但它与array_key_exists()不同。
array_key_exists()只检查键是否存在,即使值为NULL。
而 如果键存在且值为NULL, isset()将返回false。
好吧,主要的区别是isset()对于对应于空值的数组键不会返回true,而array_key_exists()会返回true。
运行一个小型基准测试会显示isset()更快,但它可能并不完全准确。
显然第二个例子的意图更清楚,这是毫无疑问的。要弄清楚示例#1的作用,您需要熟悉PHP的变量初始化特性——然后您会发现它对于空值的作用是不同的,等等。
至于哪个更快——我不打算猜测——在你的PHP版本上运行数十万次,你会发现:)
你的代码isset($array[$i]) || $array[$i] === null,在任何情况下都会返回true,即使键不存在(并产生一个未定义的索引通知)。为了获得最佳性能,您需要的是if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}
如果你对我最近做的一些测试感兴趣:
https://stackoverflow.com/a/21759158/520857
简介:
| Method Name | Run time | Difference
=========================================================================================
| NonExistant::noCheckingTest() | 0.86004090309143 | +18491.315775911%
| NonExistant::emptyTest() | 0.0046701431274414 | +0.95346080503016%
| NonExistant::isnullTest() | 0.88424181938171 | +19014.461681183%
| NonExistant::issetTest() | 0.0046260356903076 | Fastest
| NonExistant::arrayKeyExistsTest() | 1.9001779556274 | +209.73055713%
结合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/
我想就这个问题发表我的意见,因为我没有找到一个中间的解决办法。
正如前面所说,isset()将计算键的值,因此如果该值为空,它将返回false,而array_key_exists()只检查键是否存在于数组中。
我已经使用PHP 7运行了一个简单的基准测试,结果显示的是完成迭代所花费的时间:
$a = [null, true];
isset($a[0]) # 0.3258841 - false
isset($a[1]) # 0.28261614 - true
isset($a[2]) # 0.26198816 - false
array_key_exists(0, $a) # 0.46202087 - true
array_key_exists(1, $a) # 0.43063688 - true
array_key_exists(2, $a) # 0.37593913 - false
isset($a[0]) || array_key_exists(0, $a) # 0.66342998 - true
isset($a[1]) || array_key_exists(1, $a) # 0.28389215 - true
isset($a[2]) || array_key_exists(2, $a) # 0.55677581 - false
array_key_isset(0, $a) # 1.17933798 - true
array_key_isset(1, $a) # 0.70253706 - true
array_key_isset(2, $a) # 1.01110005 - false
我已经将这个自定义函数的结果添加到这个基准测试中以完成:
function array_key_isset($k, $a){
return isset($a[$k]) || array_key_exists($k, $a);
}
正如所见,isset()是最快的方法,但如果值为空,它可以返回false。这可能会产生不必要的结果,如果是这种情况,通常应该使用array_key_exists()。
然而,有一个中间的方法,那就是使用isset() || array_key_exists()。这段代码通常使用更快的函数isset(),如果isset()只返回false,则使用array_key_exists()进行验证。如上表所示,它和直接调用isset()一样快。
是的,写起来要多一点,把它包装在函数中要慢一些,但要容易得多。如果你需要它来提高性能,检查大数据等,请将其全部写出来,否则如果它是1次使用,那么函数array_key_isset()中非常小的开销可以忽略不计。
Php 7提供了使用空合并运算符的可能性。
null合并运算符(??)已被添加为语法糖,用于需要将三元值与isset()结合使用的常见情况。如果操作数存在且不为NULL,则返回第一个操作数;否则返回第二个操作数。
所以现在你可以在值为null或键不存在的情况下分配一个默认值:
$var = $array[$key] ?? 'default value'
我想补充的是,您还可以使用isset搜索具有唯一元素的数组。它比使用in_array, array_search或array_key_exists快得多。您可以使用array_flip翻转数组,并使用isset检查数组中是否存在value。
<?php
$numbers = [];
for ($i = 0; $i < 1000000; $i++) {
$numbers[] = random_int("9000000000", "9999999999");
}
function evaluatePerformance($name, $callback)
{
global $numbers;
$timeStart = microtime(true);
$result = $callback("1234567890", $numbers) ? 'true' : 'false';
$timeEnd = microtime(true);
$executionTime = number_format($timeEnd - $timeStart, 9);
echo "{$name} result is {$result} and it took {$executionTime} seconds. <br>";
}
// Took 0.038895845 seconds.
evaluatePerformance("in_array", function ($needle, $haystack) {
return in_array($needle, $haystack);
});
// Took 0.035454988 seconds.
evaluatePerformance("array_search", function ($needle, $haystack) {
return array_search($needle, $haystack);
});
$numbers = array_flip($numbers);
// Took 0.000024080 seconds.
evaluatePerformance("array_key_exists", function ($needle, $haystack) {
return array_key_exists($needle, $haystack);
});
// Took 0.000013113 seconds.
evaluatePerformance("isset", function ($needle, $haystack) {
return isset($haystack[$needle]);
});