考虑以下两个例子……

$key = 'jim';

// example 1
if (isset($array[$key])) {
    // ...
}

// example 2    
if (array_key_exists($key, $array)) {
    // ...
}

我想知道这两种方法是否更好。我一直使用第一个例子,但在这个网站上看到很多人使用第二个例子。

那么,哪个更好呢?更快呢?清晰的意图?


当前回答

Isset()更快,但它与array_key_exists()不同。

array_key_exists()只检查键是否存在,即使值为NULL。

而 如果键存在且值为NULL, isset()将返回false。

其他回答

好吧,主要的区别是isset()对于对应于空值的数组键不会返回true,而array_key_exists()会返回true。

运行一个小型基准测试会显示isset()更快,但它可能并不完全准确。

你的代码isset($array[$i]) || $array[$i] === null,在任何情况下都会返回true,即使键不存在(并产生一个未定义的索引通知)。为了获得最佳性能,您需要的是if (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}

结合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()更快,但它与array_key_exists()不同。

array_key_exists()只检查键是否存在,即使值为NULL。

而 如果键存在且值为NULL, isset()将返回false。

它和php。net是不同的

isset()不会为数组返回TRUE 对应NULL值的键, 而array_key_exists()可以。

一个非常非正式的测试显示,array_key_exists()比isset()慢2.5倍左右。