检查空数组:计数vs空
这个关于“ 如何判断一个PHP数组是否为空 ”的问题让我想到了这个问题
当确定一个数组是否为empty
时,是否有一个count
应该被用来代替empty
的原因?
我个人的想法是,如果2是相等的空数组的情况下,你应该使用empty
因为它给布尔问题的布尔答案。 从上面链接的问题看来, count($var) == 0
是stream行的方法。 对我而言,虽然技术上是正确的,但没有任何意义。 例如Q:$ var,你是空的吗? 答:7 。 嗯…
是否有一个原因,我应该使用count == 0
或只是一个个人的品味问题?
正如其他人在一个已经被删除的答案的评论中指出的那样, count
将会对大数组产生性能影响,因为它将不得不计算所有元素,而empty
知道它一知道它不是空的就立即停下来。 所以,如果他们在这种情况下给出相同的结果,但count
可能是低效的,为什么我们会用count($var) == 0
?
我通常使用empty
。 我不知道为什么人们会真正使用计数 – 如果数组很大,则计数需要更长的时间/有更多的开销。 如果您只需要知道数组是否为空,则使用空白。
我很好奇,看哪一个实际上更快,所以我做了一个简单的脚本来testing这些function。
<?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:
-
在这两种情况下,empty()比count()要快得多,并且有一个空的数组
-
count()对完整或空数组执行相同操作。
-
做一个简单的IF或只是一个布尔操作是相同的。
-
IF / ELSE比(?:)稍微有效一些。 除非你用中间expression式进行数十亿次的迭代,否则这是完全不重要的。
结论如果您使用HHVM:
-
empty()比count()less了一点儿,但却微不足道。
[其余部分与PHP相同]
在总结结论,如果你只是需要知道数组是否为空总是使用空();
这只是一个简单的testing,没有考虑很多事情。 这只是一个概念的certificate,并不能反映生产中的操作。
我认为这只是个人喜好。 有些人可能会说empty
更快(例如http://jamessocol.com/projects/count_vs_empty.php ),而其他人可能会说count
最好,因为它最初是为数组而devise的。 empty
更一般,可以应用于其他types。
虽然php.net给出了以下警告:
对于未设置的variables,count()可能返回0,但对于已经用空数组初始化的variables,count()也可以返回0。 使用isset()来testing是否设置了一个variables。
换句话说,如果这个variables没有设置,你会从PHP得到一个通知,说它是未定义的。 因此,在使用count
之前,最好用isset
检查variables。 empty
这不是必要的。
当确定一个数组是否为空时,是否有一个计数应该被用来代替空的原因?
有,当你需要做非空arrays上的东西知道它的大小:
if( 0 < ( $cnt = count($array) ) ) { echo "Your array size is: $cnt"; } else echo "Too bad, your array is empty :(";
但是我不会推荐使用count,除非你是100%确定的,你所指望的是一个数组。 最近我一直在debugging代码,其中错误函数返回FALSE
而不是空数组,我发现的是:
var_dump(count(FALSE));
输出:
int 1
所以,从那时起,我使用empty
或if(array() === $array)
来确保我有一个空的数组 。
或者,您可以将该variables作为布尔(隐式或显式)转换:
if( $value ) { // array is not empty } if( (bool) $value ) { // array is still not empty }
如果variables未定义,则此方法会生成E_NOTICE
,与count()
类似。
有关更多信息,请参阅types比较的PHP手册页 。
count()
似乎更适用于实现ArrayAccess/Countable
的类似数组的接口。 对于这些types的对象, empty()
返回true,即使它们没有元素也是如此。 通常这些类将实现Countable
接口,所以如果问题是“这个集合是否包含元素? 没有对实现做出假设,那么count()
是一个更好的select。
我个人的喜好更多的是编码优雅(关于我的具体使用情况)。 我同意丹McG inasmuch计数()没有响应与正确的数据types(在这种情况下布尔)的有问题的testing迫使开发人员编写更多的代码,以填补“如果”的声明。
这对于性能有什么重大的影响,对于极其庞大的arrays(在大多数情况下,你可能没有足够的内存分配),这只是值得商榷的。
特别是当涉及到PHP的$ _POST数组时,在我看来,看起来更符合逻辑:
if ( !empty ( $_POST ) ) { // deal with postdata }
希望这可能有助于某人,即使它已经被回答了(并辩论了一些什么)。 在我自己的场景中,我知道我所有的数组都有7个元素(检查是在我的代码中进行的),我正在执行一个array_diff
,当然返回数组为零的时候相等。
我有34秒的count
和17秒的empty
。 两者都给了我相同的计算,所以我的代码还是很好的。
但是,你也可以尝试==
或===
在PHP中 – 检查两个数组是否相等 。 最好的我会说的是尝试count
vs empty
vs == empty array
,然后看哪个给你自己最好的perfs。 在我的情况下count
是最慢的,所以我现在使用empty
…将检查下一个serialize
有没有强烈的理由喜欢count($myArray) == 0
empty($myArray)
。 它们具有相同的语义。 有些人可能会发现一个比另一个更可读。 一个可能比另一个稍微好一些,但它不可能是绝大多数的PHP应用程序的重要因素。 对于所有的实际目的,select是一个品味的问题。
有时使用空是必须的。 例如这个代码:
$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。
注意:在某些系统上,不可能区分空匹配和错误。
另外检查这个问题: 为什么计数(false)返回1?
我重塑了我的思想家伙,谢谢。
好的, empty
的使用和count
没有区别。 从技术上说, count
应该用于数组, empty
可以用于数组和string。 所以在大多数情况下,它们是可以互换的,如果你看到php文档,你会看到count
的提示列表,如果你是empty
,反之亦然。
由于被parsing为负数的variables会返回int(1)
和count()
我更喜欢($array === [] || !$array)
来testing一个空的数组。
是的,我们应该期望一个空的数组,但是我们不应该期望在没有强制返回types的情况下对函数进行很好的实现。
count()
例子
var_dump(count(0)); > int(1) var_dump(count(false)); > int(1)