Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking for empty arrays: count vs empty

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?

like image 302
Dan McGrath Avatar asked Feb 07 '10 05:02

Dan McGrath


People also ask

How do you check the array is empty or not?

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.

How do you check whether an array is empty or not in C?

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.


2 Answers

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.

like image 149
prodigitalson Avatar answered Oct 03 '22 02:10

prodigitalson


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:

  1. empty() is much much faster than count() in both scenarios, with an empty and populated array

  2. count() performs the same with a full or empty array.

  3. Doing a simple IF or just a Boolean operation is the same.

  4. 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:

  1. 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.

like image 34
Satake Avatar answered Oct 03 '22 03:10

Satake