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

2022-08-31 00:44:56

我见过很多人做前者,做一个与另一个有什么性能优势吗?还是只是一个眼睛糖果?我个人每次都使用后者,因为它更短,我个人更易读。


答案 1

其他响应侧重于两个函数之间的差异。这是真的,但如果源数组不包含 或 , ...(空值)值,您可以对两个函数的速度进行基准测试:null0""

<?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)]);
}));

这给了我以下结果:

对于小型数组:

  • array_key_exists: 浮量(0.18357992172241)
  • empty: 浮点(0.072798013687134)
  • isset: 浮点(0.070242881774902)

对于相对较大的数组:

  • array_key_exists: 浮点型(0.57489585876465)
  • empty: 浮点(0.0068421363830566)
  • isset: 浮点(0.0069410800933838)

因此,如果可能的话,使用或的速度会更快。emptyisset


答案 2

array_key_exists($key, $array)并且可以产生不同的结果,因此这不是性能或偏好的问题!empty($array[$key])

                              | 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                |

您可以看到,对于 falsey 值(false、0、NULL 等),真值表是不同的。因此,不适用于可能被视为存在虚假值的情况,例如 不应在值 0 有意义的情况下测试空性。!empty($array[$key])$array["number_of_children"]


您可以使用 它 产生的结果与只有一个例外的结果相同:isset($array[$key])array_key_exists($key, $array)

                                      | 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               |