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

时间:2011-04-29 17:24:40

标签: php arrays performance

count()是否真的计算了PHP数组的所有元素,或者这个值是否缓存在某处并且只是被检索?

3 个答案:

答案 0 :(得分:116)

好吧,我们可以查看来源:

/ext/standard/array.c

PHP_FUNCTION(count)调用php_count_recursive(),后者又调用zend_hash_num_elements()表示非递归数组,这是以这种方式实现的:

ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
    IS_CONSISTENT(ht);

    return ht->nNumOfElements;
}

所以你可以看到O(1)的{​​{1}}。

答案 1 :(得分:6)

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

编辑:您也可能会发现此分析很有趣:PHP Count Performance。虽然数组的长度是由数组维护的,但如果要多次调用count(),它仍然可以更快地保持它。

答案 2 :(得分:4)

PHP在内部存储一个数组的大小,但是你仍然在进行一个函数调用,而这个函数调用比没有函数调用慢,所以如果你正在做类似的事情,你会想要将结果存储在一个变量中它循环:

例如,

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

此外,您无法始终确保在阵列上调用count。例如,如果在实现Countable的对象上调用它,则将调用该对象的count方法。