PHP isset 和 array_key_exists 对比
经常使用 isset 判断变量或数组中的键是否存在,但是数组中可以使用 array_key_exists 这个函数,那么这两个
哪一个更优呢?
官方文档这样定义两者:
isset:语言构造器,用于检测变量是否已设置并且非 NULL,文档地址:http://php.net/manual/zh/function.isset.php
array_key_exists:函数,用于检查数组里是否有指定的键名或索引,文档地址:http://php.net/manual/zh/function.array-key-exists.php
注意:
1.isset 对于数组中为 NULL 的值不会返回 true,而 array_key_exists() 会
2.array_key_exists() 仅仅搜索第一维数组的键。多维数组里嵌套的键不会被搜到
接下来我们来对比一下两者的执行效率,测试代码如下:
#Example php version 5.2.5
<?php
2
3 $test_arr = array('aa'=>'dd','bb'=>'','cc'=>null,'dd'=>false);
4
5 echo "isset aa is ";var_dump(isset($test_arr['aa']));echo "\n";
6 echo "isset bb is ";var_dump(isset($test_arr['bb']));echo "\n";
7 echo "isset cc is ";var_dump(isset($test_arr['cc']));echo "\n";
8 echo "isset dd is ";var_dump(isset($test_arr['dd']));echo "\n";
9
10 //############################
11
12 echo "key_exist aa is ";var_dump(array_key_exists('aa',$test_arr));echo "\n";
13 echo "key_exist bb is ";var_dump(array_key_exists('bb',$test_arr));echo "\n";
14 echo "key_exist cc is ";var_dump(array_key_exists('cc',$test_arr));echo "\n";
15 echo "key_exist dd is ";var_dump(array_key_exists('dd',$test_arr));echo "\n";
16 echo "key_exist none is ";var_dump(array_key_exists('none',$test_arr));echo "\n";
17
18 //#############################
19
20 $start_time = microtime(true);
21 for($i = 0;$i < 10000;$i++) {
22 isset($test_arr['aa']);
23 }
24 $end_time = microtime(true);
25 $time = $end_time - $start_time;
26 echo "isset 10000 is $time\n";
27
28 $start_time = microtime(true);
29 for($i = 0;$i < 1000000;$i++) {
30 isset($test_arr['aa']);
31 }
32 $end_time = microtime(true);
33 $time = $end_time - $start_time;
34 echo "isset 1000000 is $time\n";
35
36 //##############################
37
38 $start_time = microtime(true);
39 for($i = 0;$i < 10000;$i++) {
40 array_key_exists('aa',$test_arr);
41 }
42 $end_time = microtime(true);
43 $time = $end_time - $start_time;
44 echo "array_key_exists 10000 is $time\n";
45
46 $start_time = microtime(true);
47 for($i = 0;$i < 1000000;$i++) {
48 array_key_exists('aa',$test_arr);
49 }
50 $end_time = microtime(true);
51 $time = $end_time - $start_time;
52 echo "array_key_exists 1000000 is $time\n";
53
54 //###############################
55
56 $start_time = microtime(true);
57 for($i = 0;$i < 10000;$i ++) {
58 in_array('dd',$test_arr);
59 }
60 $end_time = microtime(true);
61 $time = $end_time - $start_time;
62 echo "in_array 10000 is $time\n";
63
64 $start_time = microtime(true);
65 for($i = 0;$i < 1000000;$i++) {
66 in_array('dd',$test_arr);
67 }
68 $end_time = microtime(true);
69 $time = $end_time - $start_time;
70 echo "in_array 1000000 is $time\n"; ----------------------------------------------- 输出结果 isset aa is bool(true) isset bb is bool(true) isset cc is bool(false) isset dd is bool(true) key_exist aa is bool(true) key_exist bb is bool(true) key_exist cc is bool(true) key_exist dd is bool(true) key_exist none is bool(false) isset 10000 is 0.00150918960571
isset 1000000 is 0.113389968872
array_key_exists 10000 is 0.00272583961487
array_key_exists 1000000 is 0.272269964218
in_array 10000 is 0.00281500816345
in_array 1000000 is 0.281803131104
从上面的示例中我们可以看出 isset() 对应数组的 value 为 null 会返回 false,当对应数组为 空字符串或false 的时候
返回 true
array_key_exists() 只有数组不存在对应的 key 时才返回 false,其余返回 true
另外,从上面示例中也可以看出执行效率 isset > array_key_exists > in_array
PHP isset 和 array_key_exists 对比的更多相关文章
- 判断数组中有没有某个键 isset 和 array_key_exists 的效率比较
判断数组中有没有某个键 isset 和 array_key_exists 谁的效率高呢? 使用 array_key_exists 代码如下 结果如下 如果使用 isset 代码如下 结果如下: 很明显 ...
- PHP中测试in_array、isset、array_key_exists性能
测试in_array.isset.array_key_exists性能.自己写的简易测试代码: ini_set('display_errors',true); error_reporting(E_AL ...
- PHP判断键值数组是否存在,使用empty或isset或array_key_exists(转)
一个例子 猜猜看,下面的例子会输出什么? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php $a = array('a'=>1, 'b'=>0, 'c'= ...
- PHP判断键值数组是否存在,使用empty或isset或array_key_exists
<?php $a = array('a'=>1, 'b'=>0, 'c'=>NULL); echo 'a test by empty: ' , empty($a['a']) ...
- isset() 与 array_key_exists() 比较
1.对于数组值的判断不同,对于值为null或''或false,isset返回false,array_key_exists返回true: 2. 执行效率不同,isset是内建运算符,array_key_ ...
- json_encode和json_decode和isset和array_key_exists
1.json_decode() json_decode — 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool ...
- isset或array_key_exists,检查数组键是否存在
今天在导出报表的时候遇到了一个问题,undefined index:pid,然后就纳闷了,我的数组里面根本就没有pid,为什么会出现这个错误呢,我遍历了一下数组,发现果然有pid这个键,奇怪呀,我有做 ...
- PHP 中数组函数 isset 效率比 array_key_exists 更高
PHP 中数组函数 isset 效率比 array_key_exists 更高 PHP 浏览:4194 2014年04月05日 isset 和 array_key_exists 函数都可以用来测试数组 ...
- isset、empty、var==null、is_null、var===null详细理解
//isset: 判断变量是否被初始化 //它并不会判断变量是否为空,并且可能用来判断数组中元素是否被定义 //听说在数组用isset与array_key_exists高出4倍 $a = " ...
随机推荐
- Node.js的进程管理
众所周知Node基于V8,而在V8中JavaScript是单线程运行的,这里的单线程不是指Node启动的时候就只有一个线程,而是说运行JavaScript代码是在单线程上,Node还有其他线程,比如进 ...
- 怎么用js实现jq的removeClass方法
1.addClass:为指定的dom元素添加样式. 2.removeClass:删除指定dom元素的样式. 3.toggleClass:如果存在(不存在),就删除(添加)一个样式. 4.hasClas ...
- 用SQL快速删除U8账套
一.问题提出 通过"系统管理"来删除999账套,首先要求你备份然后才能删除.头痛的是: 1)备份需要发费很长的时间,特别是账套数据文件比较大时. 2)备份时,你的本本基本处于死机状 ...
- 数组copy
数组copy(推荐用法) System.arraycopy的用法 int[] src = {1,3,5,7,9,11,13,15,17}; int[] dest = {2,4,6,8,10,12,14 ...
- 查看Sql Server 数据库的内存使用情况
-- 查询SqlServer总体的内存使用情况 select type , sum(virtual_memory_reserved_kb) VM_Reserved , sum(virtual_memo ...
- stm32专属于菜鸟的学习方法
1.首先我们先看看与STM32相关的文档 我们假定大家已经对STM32的书籍或者文档有一定的理解.如不理解,请立即阅读STM32的文档,以获取最基本的知识点. 如果你手上拥有ST官方主推的STM32神 ...
- daemon函数详解
https://blog.csdn.net/xinyuan510214/article/details/50903280
- java异常处理解决方案
一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出. 2.只有此类或其子类才 ...
- ios dispatch_async使用
一般这样使用: dispatch_async(dispatch_get_global_queue(0, 0),^{ //进入另一个线程 dispatch_async(dispatch_get_main ...
- 对Java代码加密的两种方式,防止反编译
使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...