zoukankan      html  css  js  c++  java
  • PHP判断键值数组是否存在,使用empty或isset或array_key_exists

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

    本文目的

    前 几天工作中,需要频繁判断数组中的键值对是否存在,起初使用的”!empty($arr[‘key’])”来判断,觉得这样读起来比较舒服,但是写出的代 码无法通过单元测试(单元测试太好了)。排查很久,终于发现,当$arr[‘key’] == 0时,empty仍然返回true,这样破坏了业务逻辑!

    今天终于有空,就将判断数组键值对存在的方法查阅了一下,记录于此,作为备忘。

    一个例子

    猜猜看,下面的例子会输出什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $a = array('a'=>1, 'b'=>0, 'c'=>NULL);
     
    echo 'a test by empty: ' , empty($a['a']) ? 'not exist' : 'exist', PHP_EOL;
    echo 'a test by isset: ' , isset($a['a']) ? 'exist' : 'not exist', PHP_EOL;
    echo 'a test by array_key_exists: ' , array_key_exists('a', $a) ? 'exist' : 'not exist', PHP_EOL, PHP_EOL;
     
    echo 'b test by empty: ' , empty($a['b']) ? 'not exist' : 'exist', PHP_EOL;
    echo 'b test by isset: ' , isset($a['b']) ? 'exist' : 'not exist', PHP_EOL;
    echo 'b test by array_key_exists: ' , array_key_exists('b', $a) ? 'exist' : 'not exist', PHP_EOL, PHP_EOL;
     
    echo 'c test by empty: ' , empty($a['c']) ? 'not exist' : 'exist', PHP_EOL;
    echo 'c test by isset: ' , isset($a['c']) ? 'exist' : 'not exist', PHP_EOL;
    echo 'c test by array_key_exists: ' , array_key_exists('c', $a) ? 'exist' : 'not exist', PHP_EOL, PHP_EOL;

    输出结果如下:

    ========================================================

    a test by empty: exist

    a test by isset: exist

    a test by array_key_exists: exist

    b test by empty: not exist

    b test by isset: exist

    b test by array_key_exists: exist

    c test by empty: not exist

    c test by isset: not exist

    c test by array_key_exists: exist

    ========================================================

    注意红色高亮部分

    三种方式的语法区别

    • empty: 参数为0或为NULL时(如上面列子),empty均返回TRUE,详细情况可以参见empty官方手册
    • isset: 参数为NULL时,返回FALSE,0与NULL在PHP中是有区别的,isset(0)返回TRUE
    • array_key_exists: 纯粹的判断数组键值对是否存在,无论值是多少

    所以,从准确性的角度来看,array_key_exists是最准确的!

    三种方式的性能比较

    从网上拿到一组数据,参见这里或参考资料,如下所示:

    For a small array:

    array_key_exists: float(0.18357992172241)

    empty: float(0.072798013687134)

    isset: float(0.070242881774902)

    For a relative big array:

    array_key_exists: float(0.57489585876465)

    empty: float(0.0068421363830566)

    isset: float(0.0069410800933838)

    可以看到在大数据情况下,empty和isset的性能比array_key_exists快了2个数量级,差别还是很大。如果频繁判断,还是需要 优化。产生这么大性能差别的原因,个人猜测,可能是isset和empty作为php语法结构不是函数,php解释器做了优化,而 array_key_exists作为函数,没有相关优化。具体原因,有待通过源码考究。

    三种方式的使用建议

    (鉴于empty与isset性能类似,但是isset准确性较高,这里就只比较isset与array_key_exists)

    • 如果数组不可能出现值为NULL的情况,建议使用isset
    • 如果数组中经常出现值为NULL的情况,建议使用array_key_exists
    • 如果数组中可能出现值为NULL,但是较少的情况,建议结合isset与array_key_exists使用,如“if (isset($arr[‘key’]) || array_key_exists(‘key’, $arr)){/*do somthing*/}”。此方法兼顾了性能和准确性,但是代码变长了。
  • 相关阅读:
    time 模块学习
    day 14 自定义模块,常用模块 time .datetime ,time 模块
    day 13 课后作业
    day 12 课后作业
    day 11课后作业
    树状数组最值
    hdu 1059 Dividing bitset 多重背包
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    最长公共子序列板/滚动 N^2
    Uva 10635
  • 原文地址:https://www.cnblogs.com/shsgl/p/4152737.html
Copyright © 2011-2022 走看看