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


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

我见过很多人使用前者,那么使用前者和使用后者在性能上有什么好处吗?或者这只是一个花瓶?我个人每次都使用后者,因为它更短,对我个人来说更容易读懂。

其他的回答集中在两个函数之间的区别。这是真的,但如果源阵列不包含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: float(0.18357992172241)
  • empty: float(0.072798013687134)
  • isset: float(0.070242881774902)

对于相对较大的数组:

  • array_key_exists: float(0.57489585876465)
  • empty: float(0.0068421363830566)
  • isset: float(0.0069410800933838)

所以如果可能的话,使用emptyisset会更快。

虽然,我想强调这是一个微优化,这很可能不会太重要。在您最终专注于这些小的优化之前,您需要实际地进行适当的分析,以找到应用程序中的瓶颈在哪里。

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                |

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


您可以使用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               |
$array = array(
    'foo' => null
);
echo (int)!empty($array['foo']); // 0
echo (int)array_key_exists('foo', $array); // 1

它们是不同的

array_key_exists($key, $array)检查键是否存在于数组中,如果给定的键在数组中设置,则返回TRUE。

!empty($array[$key])判断变量值是否为空