array_key_exists($key, $array) vs !empty($array[$key])

前端 未结 4 1463
清酒与你
清酒与你 2021-01-01 18:09

I\'ve seen a lot of people do the former, is there any performance benefit doing one vs the other? Or is it just an eye candy? I personally use the latter every time as it i

相关标签:
4条回答
  • 2021-01-01 18:26

    They both are different

    array_key_exists($key, $array) checks whether the key exist in the array and returns TRUE if the given key is set in the array.

    whereas

    !empty($array[$key]) Determine whether a variable value is empty or not

    0 讨论(0)
  • 2021-01-01 18:39

    array_key_exists($key, $array) and !empty($array[$key]) can produce different results therefore it is not a matter of performance or preference.

                                  | array_key_exists($key, $array) | !empty($array[$key]) |
    +-----------------------------+--------------------------------|----------------------+
    | $array[$key] does not exist | false                          | false                |
    | $array[$key] is truthy      | true                           | true                 |
    | $array[$key] is falsey      | true                           | false                |
    

    You can see that the truth table is different for falsey values (false, 0, NULL, etc). Therefore !empty($array[$key]) is not suitable in situations where a falsey value could be considered present e.g. $array["number_of_children"] should not be tested for emptiness where the value 0 makes sense.


    You can use isset($array[$key]) which produces results identical to array_key_exists($key, $array) with exactly one exception:

                                          | array_key_exists($key, $array) | isset($array[$key]) |
    +-------------------------------------+--------------------------------|---------------------+
    | $array[$key] does not exist         | false                          | false               |
    | $array[$key] is truthy              | true                           | true                |
    | $array[$key] is falsey but not NULL | true                           | true                |
    | $array[$key] is NULL                | true                           | false               |
    
    0 讨论(0)
  • 2021-01-01 18:45
    $array = array(
        'foo' => null
    );
    
    echo (int)!empty($array['foo']); // 0
    echo (int)array_key_exists('foo', $array); // 1
    
    0 讨论(0)
  • 2021-01-01 18:52

    The other responses focus on the differences between the two functions. This is true, but if the source array does not contain null or 0 or "", ... (empty values) values you can benchmark the speed of the two functions:

    <?php
    
    function makeRandomArray( $length ) {
        $array = array();
        for ($i = 0; $i < $length; $i++) {
            $array[$i] = rand(1, $length);
        }
    
        return $array;
    }
    
    function benchmark( $count, $function ) {
        $start = microtime(true);
        for ($i = 0; $i < $count; $i++) {
            $function();
        }
        return microtime(true) - $start;
    }
    
    $runs = 100000;
    $smallLength = 10;
    $small = makeRandomArray($smallLength);
    
    var_dump(benchmark($runs, function() {
        global $small, $smallLength;
        array_key_exists(rand(0, $smallLength), $small);
    }));
    var_dump(benchmark($runs, function() {
        global $small, $smallLength;
        !empty($small[rand(0, $smallLength)]);
    }));
    

    Which gave me the following results:

    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)

    So if it's possible it's faster to use empty or isset.

    0 讨论(0)
提交回复
热议问题