Does count() really count the all the elements of a PHP array, or is this value cached somewhere and just gets retrieved?
- 7Why not test it? it's simple enough to do a loop that adds elements to an array and counts each time and do some timing.Marc B– Marc B2011-04-29 17:26:47 +00:00Commented Apr 29, 2011 at 17:26
- 3Take a look at this question: stackoverflow.com/questions/2473989/…The Pixel Developer– The Pixel Developer2011-04-29 17:29:25 +00:00Commented Apr 29, 2011 at 17:29
- Google keywords - this question could also be formulated as: Does PHP count() iterates over array or does it retrieve count from array property ?jave.web– jave.web2015-09-01 12:07:41 +00:00Commented Sep 1, 2015 at 12:07
3 Answers
Well, we can look at the source:
PHP_FUNCTION(count) calls php_count_recursive(), which in turn calls zend_hash_num_elements() for non-recursive array, which is implemented this way:
ZEND_API int zend_hash_num_elements(const HashTable *ht) { IS_CONSISTENT(ht); return ht->nNumOfElements; } So you can see, it's O(1) for $mode = COUNT_NORMAL.
12 Comments
IS_CONSISTENT(ht) do though?In PHP 5+ the length is stored in the array so the counting is not done each time.
Although the length of the array is maintained by the array, it still seems as though it is faster to hold on to it if you are going to call count() many times.
2 Comments
PHP stores the size of an array internally, but you're still making a function call when which is slower than not making one, so you'll want to store the result in a variable if you're doing something like using it in a loop:
For example,
$cnt = count($array); for ($i =0; $i < $cnt; $i++) { foo($array[$i]); } Additionally, you can't always be sure count is being called on an array. If it's called on an object that implements Countable for example, the count method of that object will be called.
5 Comments
the count method of that object will be called, can you please explain this a bitCountable interface, then calling count($object) is the same thing as calling $object->count(). See 3v4l.org/oYSSC for example.you're still making a function call when which is slower than not making one This statement can be wrong. If you are doing manual traversal, that is O(n) operation. But if you just want to retrieve a pre calculated value, then operation is O(1).foreach.