经常使用 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 对比的更多相关文章

  1. 判断数组中有没有某个键 isset 和 array_key_exists 的效率比较

    判断数组中有没有某个键 isset 和 array_key_exists 谁的效率高呢? 使用 array_key_exists 代码如下 结果如下 如果使用 isset 代码如下 结果如下: 很明显 ...

  2. PHP中测试in_array、isset、array_key_exists性能

    测试in_array.isset.array_key_exists性能.自己写的简易测试代码: ini_set('display_errors',true); error_reporting(E_AL ...

  3. 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'= ...

  4. PHP判断键值数组是否存在,使用empty或isset或array_key_exists

    <?php $a = array('a'=>1, 'b'=>0, 'c'=>NULL);   echo 'a test by empty: ' , empty($a['a']) ...

  5. isset() 与 array_key_exists() 比较

    1.对于数组值的判断不同,对于值为null或''或false,isset返回false,array_key_exists返回true: 2. 执行效率不同,isset是内建运算符,array_key_ ...

  6. json_encode和json_decode和isset和array_key_exists

    1.json_decode() json_decode — 对 JSON 格式的字符串进行编码         说明 mixed json_decode ( string $json [, bool ...

  7. isset或array_key_exists,检查数组键是否存在

    今天在导出报表的时候遇到了一个问题,undefined index:pid,然后就纳闷了,我的数组里面根本就没有pid,为什么会出现这个错误呢,我遍历了一下数组,发现果然有pid这个键,奇怪呀,我有做 ...

  8. PHP 中数组函数 isset 效率比 array_key_exists 更高

    PHP 中数组函数 isset 效率比 array_key_exists 更高 PHP 浏览:4194 2014年04月05日 isset 和 array_key_exists 函数都可以用来测试数组 ...

  9. isset、empty、var==null、is_null、var===null详细理解

    //isset: 判断变量是否被初始化 //它并不会判断变量是否为空,并且可能用来判断数组中元素是否被定义 //听说在数组用isset与array_key_exists高出4倍 $a = " ...

随机推荐

  1. LomBok插件的使用

    LomBok插件的使用 By Zhai 简介: LomBok是一个通过简单注解就可以减少一些冗余代码编写的小工具.例如 @Setter @Getter 用于实例类上该类就不需要写set get 方法. ...

  2. 巧用border效果

    目的: 我们在做css的时候为了提高网站的效率减少服务器请求,我们可以通过css来实现一些简单的图片特效,比如说三角形,这篇文章讲解的是通过边框实现不同的效果. 上面样式部分代码: <style ...

  3. 微信JS-SDK说明文档【申明:来源于网络】

    微信JS-SDK说明文档[申明:来源于网络] 地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

  4. MOT南京站 | 卓越研发之路:锻造顶级后端系统

    代码是互联网企业信息化核心,也是众多研发团队智慧的结晶,如何将代码发挥到最大价值?如何用代码快.准.好的实现需求?相信这是很多IT从业者所困扰的问题. MOT南京站首期以『锻造顶级后端系统』为主题,我 ...

  5. 常用oracle hints

    在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方 ...

  6. 使用hashlib进行登录校验

    注册登录和密码验证 用户注册时,文件中保存用户名,和密码的密文 登录时,密码与文件中的密文进行比较,如果相同就同意登录 import hashlib # 导入模块 def md5(username,p ...

  7. c++stack容器介绍

    c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO) 使用该容器时需要包含#include<stack>头文件: 定义stack对象的示例代码如下: sta ...

  8. OC 使用CIFilter添加图片

    +(UIImage *)createInviteImgWithUserCodeStr:(NSString *)userCode{ userCode = [NSString stringWithForm ...

  9. MD5在线加密的应用

    MD5是message-digest algorithm 5(信息-摘要算法)的缩写.被广泛用于加密和解密技术上,是文件的“数字指纹”.可以对用户的密码进行加密操作,是不可逆的,所以用户输入的密码经过 ...

  10. rosetta deep_analysis

    此小程序可以分析backrub,enzdes类的聚类logo分析,详细路径是: /home/wangq/Programs/rosetta_2018.09.60072_bundle/tools/prot ...