检查空数组:count vs empty

时间:2010-02-07 05:56:36

标签: php arrays performance standards semantics

关于'How to tell if a PHP array is empty'的这个问题让我想到了这个问题

在确定数组是否为空时,是否有理由使用count代替empty

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

我是否应该使用count == 0代替个人品味呢?

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

12 个答案:

答案 0 :(得分:90)

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

答案 1 :(得分:40)

我很想知道哪一个实际上更快,所以我制作了一个简单的脚本来对这些功能进行基准测试。

<?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比(?:)更有效。除非你在中间用表达式进行数十亿次迭代,否则它是完全无关紧要的。

  5. 结论如果你正在使用HHVM:

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

      [其余与PHP相同]

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

      这只是一个奇怪的测试,只是在没有考虑很多因素的情况下完成。它只是一个概念证明,可能无法反映生产中的操作。

答案 2 :(得分:15)

我认为这只是个人偏好。有些人可能会说empty更快(例如http://jamessocol.com/projects/count_vs_empty.php)而其他人可能会说count更好,因为它最初是为数组制作的。 empty更为通用,可以应用于其他类型。

php.net为count提供了以下警告:

  对于未设置的变量,

count()可能返回0,但对于已使用空数组初始化的变量,它也可能返回0。使用isset()来测试是否设置了变量。

换句话说,如果未设置变量,您将收到PHP的通知,说它未定义。因此,在使用count之前,最好使用isset检查变量。 empty无需这样做。

答案 3 :(得分:10)

  

在确定数组是否为空时,是否有理由使用count而不是empty?

当你需要在非空数组上做某事时知道它的大小:

if( 0 < ( $cnt = count($array) ) )
{
 echo "Your array size is: $cnt";
}
else
 echo "Too bad, your array is empty :(";

但是我不建议使用计数,除非你100%确定,你所计算的是一个数组。最近我一直在调试代码,其中错误函数返回FALSE而不是空数组,我发现的是:

var_dump(count(FALSE));

输出:

int 1

所以从那以后我使用emptyif(array() === $array)来确保我的数组是空的。

答案 4 :(得分:6)

对于实现count()的类似数组的接口,

ArrayAccess/Countable似乎更有效。对于这些类型的对象,empty()返回true,即使它们没有元素也是如此。通常这些类将实现Countable接口,因此如果问题是“此集合是否包含元素?”在不对实施做出假设的情况下,count()是更好的选择。

答案 5 :(得分:5)

或者,您可以将变量强制转换为布尔值(隐式或显式):

if( $value )
{
  // array is not empty
}

if( (bool) $value )
{
  // array is still not empty
}

如果未定义变量,此方法会生成E_NOTICE,类似于count()

有关详细信息,请参阅the PHP Manual page on type comparisons

答案 6 :(得分:3)

我个人的偏好更多是编码优雅(与我的具体用例有关)。我同意Dan McG,因为对于有问题的测试,count()没有响应正确的数据类型(在本例中为boolean),迫使开发人员编写更多代码来填充'if'语句。

这对性能是否有任何重大影响只对极大型阵列有争议(在大多数设置中,你可能无论如何都没有足够的内存分配)。

特别是当谈到PHP的$ _POST数组时,我认为写/看起来似乎更“合乎逻辑”:

if ( !empty ( $_POST ) ) {
    // deal with postdata
}

答案 7 :(得分:3)

希望这可能对某人有所帮助,即使它已经得到了回答(并且已经辩论了一些)。在我自己的场景中,我知道我的所有数组都有7个元素(在我的代码中早先进行了检查)并且我正在执行array_diff当然在相等时返回零数组。

count我有34秒,empty有17秒。两者都给我相同的计算,所以我的代码仍然很好。

但是,您也可以在PHP - Check if two arrays are equal中尝试=====。我要说的最好是尝试count vs empty vs == empty array,然后看看哪个给出了你自己最好的效果。在我的情况下count是最慢的,所以我正在使用empty现在 ...将会检查serialize下一步

答案 8 :(得分:1)

没有充分理由倾向于count($myArray) == 0而不是empty($myArray)。它们具有相同的语义。有些人可能会发现一个比另一个更可读。一个可能比另一个稍微好一点,但它不可能是绝大多数php应用程序中的重要因素。出于所有实际目的,选择是一个品味问题。

答案 9 :(得分:1)

有时使用空是必须的。例如这段代码:

$myarray = array();

echo "myarray:"; var_dump($myarray); echo "<br>";
echo "case1 count: ".count($myarray)."<br>";
echo "case1 empty: ".empty($myarray)."<br>";

$glob = glob('sdfsdfdsf.txt');

echo "glob:"; var_dump($glob); echo "<br>";
echo "case2 count: ".count($glob)."<br>";
echo "case2 empty: ".empty($glob);

如果您运行以下代码:http://phpfiddle.org/main/code/g9x-uwi

你得到这个输出:

myarray:array(0) { } 
case1 count: 0
case1 empty: 1

glob:bool(false) 
case2 count: 1
case2 empty: 1

因此,如果您count空的glob输出,则输出错误。你应该检查空虚。

来自glob文档:

  

返回一个包含匹配文件/目录的数组,为空   如果没有文件匹配则为数组,如果错误则为FALSE   注意:在某些系统上   无法区分空匹配和错误。

同时查看此问题: Why count(false) return 1?

答案 10 :(得分:0)

我重新思考了一下,谢谢。

好的,emptycount的使用没有区别。从技术上讲,count应该用于数组,empty可以用于数组和字符串。所以在大多数情况下,它们是可以互换的,如果你看到php文档,如果你在count,你会看到empty的建议列表,反之亦然。

答案 11 :(得分:0)

由于解析为负数的变量会返回带有int(1)

count()

我更喜欢($array === [] || !$array)来测试一个空数组。

是的,我们应该期待一个空数组,但我们不应期望在没有强制返回类型的情况下对函数进行良好的实现。

count()

的示例
var_dump(count(0));
> int(1)
var_dump(count(false));
> int(1)