PHP的count()函数O(1)或O(n)是否为数组?

count()是否真的计算了一个PHP数组的所有元素,还是将这个值caching在某个地方而只是被获取?

那么,我们可以看看来源:

  /ext/standard/array.c 

PHP_FUNCTION(count)调用php_count_recursive() ,它依次调用zend_hash_num_elements()用于非recursion数组,这是通过以下方式实现的:

 ZEND_API int zend_hash_num_elements(const HashTable *ht) { IS_CONSISTENT(ht); return ht->nNumOfElements; } 

所以你可以看到,它是O(1) $mode = COUNT_NORMAL

在PHP 5+中,长度存储在数组中,因此每次都不会进行计数。

编辑:你也可能会发现这个分析很有趣: PHP计数性能 。 虽然数组的长度是由数组维护的,但是如果要多次调用count() ,仍然可以保持它的速度。

PHP在内部存储了一个数组的大小,但是当它比没有创build一个数组要慢时,你仍然在进行一个函数调用,所以如果你正在做一些像在循环:

例如,

 $cnt = count($array); for ($i =0; $i < $cnt; $i++) { foo($array[$i]); } 

此外,您不能始终确保数组正在被调用。 例如,如果在实现Countable的对象上调用该对象的count方法,则会调用该对象的count方法。