检查空数组:计数与空数组

2022-08-30 07:32:24

关于“如何判断PHP数组是否为空”的问题让我想到了这个问题。

在确定数组是否为空时,是否应该使用某个原因来代替?countempty

我个人的想法是,如果2对于你应该使用的空数组的情况是等效的,因为它给出了布尔问题的布尔答案。从上面链接的问题来看,这似乎是流行的方法。对我来说,虽然在技术上是正确的,但毫无意义。例如:问:$var,你是空的吗?答:7.嗯...emptycount($var) == 0

我应该使用的原因还是只是个人品味的问题?count == 0

正如其他人在评论中指出的那样,现在删除的答案将对大型数组的性能产生影响,因为它必须计算所有元素,而一旦知道它不是空的,就可以停止。因此,如果它们在这种情况下给出相同的结果,但可能效率低下,那么我们为什么要使用?countemptycountcount($var) == 0


答案 1

我通常使用.我不确定为什么人们会真正使用计数 - 如果数组很大,那么计数需要更长的时间/有更多的开销。如果您只需要知道数组是否为空,请使用 empty。empty


答案 2

我很好奇哪一个实际上更快,所以我做了一个简单的脚本来对这些函数进行基准测试。

<?php

function benchmark($name, $iterations, $action){
    $time=microtime(true);
    for($i=0;$i<=$iterations;++$i){
        $action();
    }
    echo $name . ' ' . round(microtime(true)-$time, 6) . "\n";
}

$iterations = 1000000;
$x = array();
$y = range(0, 10000000);
$actions = array(
    "Empty empty()" => function() use($x){
        empty($x);
    },
    "Empty count()" => function() use($x){
        count($x);
    },
    "Full empty()" => function() use($y){
        empty($y);
    },
    "Full count()" => function() use($y){
        count($y);
    },
    ############
    "IF empty empty()" => function() use($x){
        if(empty($x)){ $t=1; }
    },
    "IF empty count()" => function() use($x){
        if(count($x)){ $t=1; }
    },
    "IF full empty()" => function() use($y){
        if(empty($y)){ $t=1; }
    },
    "IF full count()" => function() use($y){
        if(count($y)){ $t=1; }
    },
    ############
    "OR empty empty()" => function() use($x){
        empty($x) OR $t=1;
    },
    "OR empty count()" => function() use($x){
        count($x) OR $t=1;
    },
    "OR full empty()" => function() use($y){
        empty($y) OR $t=1;
    },
    "OR full count()" => function() use($y){
        count($y) OR $t=1;
    },
    ############
    "IF/ELSE empty empty()" => function() use($x){
        if(empty($x)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE empty count()" => function() use($x){
        if(count($x)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE full empty()" => function() use($y){
        if(empty($y)){ $t=1; } else { $t=2; }
    },
    "IF/ELSE full count()" => function() use($y){
        if(count($y)){ $t=1; } else { $t=2; }
    },
    ############
    "( ? : ) empty empty()" => function() use($x){
        $t = (empty($x) ? 1 : 2);
    },
    "( ? : ) empty count()" => function() use($x){
        $t = (count($x) ? 1 : 2);
    },
    "( ? : ) full empty()" => function() use($y){
        $t = (empty($y) ? 1 : 2);
    },
    "( ? : ) full count()" => function() use($y){
        $t = (count($y) ? 1 : 2);
    }
);

foreach($actions as $name => $action){
    benchmark($name, $iterations, $action);
}
//END

由于我正在这样做,我还尝试检查通常与count()/empty()关联的操作的性能

使用 PHP 5.4.39:

Empty empty() 0.118691
Empty count() 0.218974
Full empty() 0.133747
Full count() 0.216424
IF empty empty() 0.166474
IF empty count() 0.235922
IF full empty() 0.120642
IF full count() 0.248273
OR empty empty() 0.123875
OR empty count() 0.258665
OR full empty() 0.157839
OR full count() 0.224869
IF/ELSE empty empty() 0.167004
IF/ELSE empty count() 0.263351
IF/ELSE full empty() 0.145794
IF/ELSE full count() 0.248425
( ? : ) empty empty() 0.169487
( ? : ) empty count() 0.265701
( ? : ) full empty() 0.149847
( ? : ) full count() 0.252891

使用 HipHop VM 3.6.1 (dbg)

Empty empty() 0.210652
Empty count() 0.212123
Full empty() 0.206016
Full count() 0.204722
IF empty empty() 0.227852
IF empty count() 0.219821
IF full empty() 0.220823
IF full count() 0.221397
OR empty empty() 0.218813
OR empty count() 0.220105
OR full empty() 0.229118
OR full count() 0.221787
IF/ELSE empty empty() 0.221499
IF/ELSE empty count() 0.221274
IF/ELSE full empty() 0.221879
IF/ELSE full count() 0.228737
( ? : ) empty empty() 0.224143
( ? : ) empty count() 0.222459
( ? : ) full empty() 0.221606
( ? : ) full count() 0.231288

如果您使用的是 PHP,则得出以下结论:

  1. 在这两种情况下,empty() 都比 count() 快得多,数组为空且已填充

  2. count() 对完整或空数组执行相同的操作。

  3. 执行简单的 IF 或仅执行布尔运算是相同的。

  4. IF/ELSE 的效率比 ( ? : ) 稍高。除非你在中间使用表达式进行数十亿次迭代,否则它是完全无关紧要的。

如果您使用的是 HHVM,则得出以下结论:

  1. empty() 比 count() 快一点,但微不足道。

    [ 其余的与 PHP 相同 ]

在结论的结论中,如果你只需要知道数组是否为空,请始终使用 empty();

这只是一个奇怪的测试,没有考虑到很多事情。它只是一个概念证明,可能不反映生产中的操作。