什么更快,更好地确定在PHP中是否存在数组键?
考虑这两个例子…
$key = 'jim'; // example 1 if (isset($array[$key])) { // ... } // example 2 if (array_key_exists($key, $array)) { // ... }
我有兴趣知道这些是否更好。 我一直使用第一个,但已经看到很多人在这个网站上使用第二个例子。
那么,哪个更好? 更快? 更明确的意图?
isset()
更快,但与array_key_exists()
不一样。
array_key_exists()
纯粹检查密钥是否存在,即使值为NULL
。
而isset()
将返回false
如果该键存在且值为NULL
。
如果你对我最近做的一些testing感兴趣,
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()
不会返回对应于null值的数组键,而array_key_exists()
会返回true
。
运行一个小的基准testing显示isset()
速度更快,但可能并不完全准确。
有一个区别..从php.net你会读:
对于对应于NULL值的数组键,isset()不返回TRUE,而array_key_exists()则返回TRUE。
非常非正式的testing显示array_key_exists()比isset()慢大约2.5倍
我想在这个问题上加两分钱,因为我错过了一条中间路线。
正如已经告诉的, isset()
将计算该键的值,所以如果该值为null
,那么array_key_exists()
将仅检查该键是否存在于该数组中。
我已经使用PHP 7运行了一个简单的基准testing,结果显示了完成迭代所花费的时间:
$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()
是最快的方法,但如果值为null
它可以返回false。 这可能会产生不必要的结果,如果是这种情况,通常应该使用array_key_exists()
。
然而有一个中间的出路,那就是使用isset() || array_key_exists()
isset() || array_key_exists()
。 此代码通常使用更快的函数isset()
, 如果 isset()
只返回false, 则使用array_key_exists()
进行validation。 显示在上面的表格中,就像直接调用isset()
一样快。
是的,编写一个函数会更慢一些,但是更容易一些。 如果你需要这样的性能,检查大数据等等写满,否则,如果它的1次使用,在array_key_isset()
函数中非常小的开销可以忽略不计。
结合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>"; ?>
信用 : http : //www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/
至于“更快”:尝试一下(我的钱是在array_key_exists()
,但我现在不能尝试)。
至于“意图更清楚”: array_key_exists()
显然,第二个例子的意图更清楚,毫无疑问。 为了弄清楚#1做了什么,你需要熟悉PHP的variables初始化特性 – 然后你会发现它对空值的function是不同的,等等。
至于哪个更快 – 我不打算推测 – 在你的PHP版本上运行几十万次的紧密循环,你会发现:)
你的代码isset($array[$i]) || $array[$i] === null
isset($array[$i]) || $array[$i] === null
,在任何情况下都将返回true,即使该键不存在(并且产生未定义的索引通知)。 为了获得最好的性能,你需要的是if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}