用户
 找回密码
 入住 CI 中国社区
搜索
查看: 10057|回复: 2
收起左侧

[优化] php中数组函数isset和array_key_exists的比较

[复制链接]
发表于 2010-6-19 21:14:38 | 显示全部楼层 |阅读模式
总是使用isset和array_key_exists测试数组中的变量是否存在,然后忽然很想知道到底两者有什么区别,然后百度了一下,有说array_key_exists更快的——www.laohucheng.com/post/122/,也用说isset更快的,当然似乎更多人建议isset,记得什么时候在论坛中也看到有人提及,但是没找到了
于是自己做了一个测试,比较一下两者的差异
PHP复制代码
 
    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 />';
    }
 
复制代码

几次测试结果如下:
HTML复制代码
 
结果$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
发表于 2011-12-6 11:35:31 | 显示全部楼层
两者语义不同,
例如
$a['abc']=null;
isset($a['abc'])返回 false
array_key_exists()返回 true
发表于 2011-12-21 15:42:01 | 显示全部楼层
谢谢LZ解释

本版积分规则