代码之家  ›  专栏  ›  技术社区  ›  Dan McGrath

检查空数组:计数与空

  •  89
  • Dan McGrath  · 技术社区  · 14 年前

    How to tell if a PHP array is empty

    这有什么原因吗 count 应使用而不是 empty 确定数组是否为空时?

    空的 因为它给出了一个布尔问题的布尔答案。从上面的问题来看,似乎 count($var) == 0 问:$var,你是空的吗?A:7 . 六羟甲基三聚氰胺六甲醚。。。

    count == 0 相反,还是仅仅是个人品味的问题?

    正如其他人在评论中指出的,现在删除了答案, 将对大型阵列的性能产生影响,因为它必须计算所有元素 空的 计数 计数($var)==0 ?

    12 回复  |  直到 7 年前
        1
  •  103
  •   prodigitalson    14 年前

    我通常使用 empty

        2
  •  49
  •   Satake    9 年前

    我很想知道哪一个更快,所以我制作了一个简单的脚本来测试这些函数。

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

    使用HipHopVM3.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
    

    1. 在这两种情况下,使用空且填充的数组时,empty()比count()快得多

    2. 做一个简单的IF或仅仅一个布尔运算是相同的。

    结论:如果您正在使用HHVM:

    1. empty()比count()稍微快一点,但这并不重要。

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

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

        3
  •  16
  •   Laurent Thierry Blais    14 年前

    我认为这只是个人喜好。有些人可能会说 empty http://jamessocol.com/projects/count_vs_empty.php )而其他人可能会说 count 空的 更通用,可应用于其他类型。

    php.net对以下问题发出警告:

    计数 ,最好使用 isset . 这是不必要的 空的 .

        4
  •  12
  •   dev-null-dweller    14 年前

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

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

    但我不建议使用count,除非您100%确定正在计算的是一个数组。返回函数时出错,最近调试代码的位置 FALSE 而不是空数组,我发现:

    var_dump(count(FALSE));
    

    输出:

    int 1
    

    所以从那时起我就开始使用 empty if(array() === $array) 当然我有 排列

        5
  •  6
  •   Ryan    9 年前

    count() 似乎与实现 ArrayAccess/Countable empty() 对于这些类型的对象返回true,即使它们没有元素。通常,这些类将实现 Countable 接口,因此如果问题是“此集合是否包含元素?”而不假设实现,则 计数()

        6
  •  5
  •   user212218 user212218    13 年前

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

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

    E_NOTICE 如果未定义变量,则类似于 count()

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

        7
  •  3
  •   simonhamp    14 年前

    我个人更喜欢优雅的编码(与我的特定用例相关)。我同意Dan McG的观点,因为count()没有为所讨论的测试使用正确的数据类型(在本例中为布尔值)进行响应,这迫使开发人员编写更多代码来填充“if”语句。

    特别是当谈到PHP的$u POST数组时,在我看来,编写/查看以下内容似乎更“合乎逻辑”:

    if ( !empty ( $_POST ) ) {
        // deal with postdata
    }
    
        8
  •  3
  •   Community Egal    7 年前

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

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

    但是,您也可以尝试 == === 如在 PHP - Check if two arrays are equal 计数 vs vs == empty array ,然后看看哪一个能给你最好的表现。就我而言 是最慢的吗 我正在使用 现在 ... 我会检查的 serialize

        9
  •  2
  •   Asaph    14 年前

    没有强有力的理由选择 count($myArray) == 0 结束 empty($myArray) . 它们具有相同的语义。有些人可能会发现其中一个比另一个更具可读性。一个可能比另一个稍好一些,但在绝大多数php应用程序中,这不太可能是一个重要因素。就所有实际目的而言,选择取决于品味。

        10
  •  1
  •   Community Egal    7 年前

    $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


    注意:在某些系统上,it 无法区分空匹配和错误。

    请检查此问题: Why count(false) return 1?

        11
  •  1
  •   Sdlion    7 年前

    因为解析为负数的变量将返回 int(1) count()

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

    举例

    var_dump(count(0));
    > int(1)
    var_dump(count(false));
    > int(1)
    
        12
  •  0
  •   Sarfraz    13 年前

    好的,使用 empty count . 从技术上讲 计数 空的 可以用于数组和字符串。因此,在大多数情况下,它们是可互换的,如果您看到php文档,您将看到 如果你在 空的