count()
是否真的计算了PHP数组的所有元素,或者这个值是否缓存在某处并且只是被检索?
答案 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
方法。