114

Does count() really count the all the elements of a PHP array, or is this value cached somewhere and just gets retrieved?

3
  • 7
    Why 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. Commented Apr 29, 2011 at 17:26
  • 3
    Take a look at this question: stackoverflow.com/questions/2473989/… Commented 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 ? Commented Sep 1, 2015 at 12:07

3 Answers 3

174

Well, we can look at the source:

/ext/standard/array.c

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.

Sign up to request clarification or add additional context in comments.

12 Comments

What does IS_CONSISTENT(ht) do though?
Thanks! I wasn't quite sure where in the source I should look or where to get the source (without having to check it out of a repository).
@Matt It's checking if hash structure is valid, as I can see. It's defined in zend_hash.c and it's O(1) also.
Cannot miss to vote up for someone looking for the answer in the PHP's source code :)
@Matt IS_CONSISTENT() is just a sanity check on the array github.com/php/php-src/blob/PHP-5.3/Zend/zend_hash.c#L51
|
9

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

I think you may be correct that the change was made starting with PHP 5. However, I haven't yet found the proof that PHP 4 was O(n) for count(); I just see anecdotal comments. Are you able to find proof (ie the count() implementation for PHP 4)? Thanks,
I know it is an old question, but unfortunatly the link does not work any more. Maybe the is another source on this topic that someone can recover.
6

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

is making a function call always slower than not making one? I would not be surprised to find the interpreter to have inline optimization.
the count method of that object will be called, can you please explain this a bit
@SteelBrain if a class implements the Countable 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).
The point is valid according to an answer to another question. It will save an opcode or so in an inner loop. But the example is poor: it could be written better by using foreach.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.