songah 发表于 2010-6-19 21:14:38

php中数组函数isset和array_key_exists的比较

总是使用isset和array_key_exists测试数组中的变量是否存在,然后忽然很想知道到底两者有什么区别,然后百度了一下,有说array_key_exists更快的——www.laohucheng.com/post/122/,也用说isset更快的,当然似乎更多人建议isset,记得什么时候在论坛中也看到有人提及,但是没找到了
于是自己做了一个测试,比较一下两者的差异

    function issetVsArray()
    {
      $loop = 10;

      $test = array();
      for( $i = 0; $i <= $loop; $i++)
      {
            $test['test'.$i] = $i;
      }

      $this->benchmark->mark('issetAllFalse');

      for( $i = 0; $i<=$loop; $i++)
      {
            isset($test['t'.$i]);      
      }
      $this->benchmark->mark('arraysAllFalse');
      for( $i = 0; $i<=$loop; $i++)
      {
            array_key_exists('t'.$i,$test);      
      }

      $this->benchmark->mark('issetAllTrue');
      for( $i = 0; $i<=$loop; $i++)
      {
            isset($test['test'.$i]);      
      }
      $this->benchmark->mark('arraysAllTrue');
      for( $i = 0; $i<=$loop; $i++)
      {
            array_key_exists('test'.$i,$test);      
      }
      $this->benchmark->mark('end');

      echo $this->benchmark->elapsed_time('issetAllFalse','arraysAllFalse').'<br />';
      echo $this->benchmark->elapsed_time('arraysAllFalse','issetAllTrue').'<br />';
      echo $this->benchmark->elapsed_time('issetAllTrue','arraysAllTrue').'<br />';
      echo $this->benchmark->elapsed_time('arraysAllTrue','end').'<br />';
    }

几次测试结果如下:

结果$loop=10
0.0001
0.0009
0.0001
0.0007

结果$loop=100
0.0003
0.0185
0.0003
0.0189

结果$loop=1000
0.0015
0.2831
0.0020
0.2839

结果$loop=10000
0.0157
8.4764
0.0164
8.4101

测试环境:Apache/2.2.8 (Win32) SVN/1.6.6 mod_ssl/2.2.8 OpenSSL/0.9.8k PHP/5.2.6 DAV/2 Server 。
当数组个数为10时,两者差异就体现出来了——isset速度要快近10倍,但不是很明显,而且对于变量是否存在,两者之间的差异没有太大,当变量存在时运行更快,但是这种趋势在是非常微弱的。使用array_key_exists随着循环的次数增加,程序运行的时间增加量是成几何级数增加的,当一个数组元素个数超过1000时运行速度就非常慢了。

最后总结一下

[*]isset和array_key_exists在对判断一个数组函数中某个元素是否存在,isset速度要更快,而且这种速度差异是非常大的
[*]isset属于php中的语言结构,而后者是函数,所以前者更快,isset不可以用于可变函数
[*]对于变量值的判断,当变量为NULL时,isset返回的结果是false,而后者只判断变量是否存在。所以如果判断一个数组中的某个元素,并且判断其是否是否为真,应该用isset
[*]isset属于php特定语言结构,后者在其他语言中也存在,更具可读性

参考
www.alternateinterior.com/2006/11/comparing-array_key_exists-with-isset.html

njkzkj 发表于 2011-12-6 11:35:31

两者语义不同,
例如
$a['abc']=null;
isset($a['abc'])返回 false
array_key_exists()返回 true

ci02576120 发表于 2011-12-21 15:42:01

谢谢LZ解释
页: [1]
查看完整版本: php中数组函数isset和array_key_exists的比较