This question on 'How to tell if a PHP array is empty' had me thinking of this question
Is there a reason that count
should be used instead of empty
when determining if an array is empty or not?
My personal thought would be if the 2 are equivalent for the case of empty arrays you should use empty
because it gives a boolean answer to a boolean question. From the question linked above, it seems that count($var) == 0
is the popular method. To me, while technically correct, makes no sense. E.g. Q: $var, are you empty? A: 7. Hmmm...
Is there a reason I should use count == 0
instead or just a matter of personal taste?
As pointed out by others in comments for a now deleted answer, count
will have performance impacts for large arrays because it will have to count all elements, whereas empty
can stop as soon as it knows it isn't empty. So, if they give the same results in this case, but count
is potentially inefficient, why would we ever use count($var) == 0
?
To check if an array is empty or not, you can use the . length property. The length property sets or returns the number of elements in an array. By knowing the number of elements in the array, you can tell if it is empty or not.
There's no such thing as an "empty array" or an "empty element" in C. The array always holds a fixed pre-determined number of elements and each element always holds some value.
I generally use empty
. Im not sure why people would use count really - If the array is large then count takes longer/has more overhead. If you simply need to know whether or not the array is empty then use empty.
I was curious to see which one was actually faster so I made a simple script to benchmark those functions.
<?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
Since I was doing it I also tried to check the performance doing operations that would normally be associated with count()/empty()
Using 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
Using 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
Conclusions if you're using PHP:
empty() is much much faster than count() in both scenarios, with an empty and populated array
count() performs the same with a full or empty array.
Doing a simple IF or just a Boolean operation is the same.
IF/ELSE is very slightly more efficient than ( ? : ). Unless you're doing billions of iterations with expressions in the middle it is completely insignificant.
Conclusions if you're using HHVM:
empty() is a teeny-weeny bit faster than count() but insignificantly so.
[ The rest is the same as in PHP ]
In conclusion of the conclusion, if you just need to know if the array is empty always use empty();
This was just a curious test simply done without taking many things into account. It is just a proof of concept and might not reflect operations in production.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With