[php] PHP의 count () 함수는 O (1) 또는 O (n) 배열입니까?

count()실제로 PHP 배열의 모든 요소를 ​​계산 합니까 , 아니면이 값이 어딘가에 캐시되어 검색됩니까?



답변

음, 우리는 소스를 볼 수 있습니다.

/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)위해 $mode = COUNT_NORMAL.


답변

PHP 5+에서는 길이가 배열에 저장되므로 매번 계산이 수행되지 않습니다.

편집 :이 분석이 흥미로울 수도 있습니다 : PHP Count Performance . 배열의 길이는 배열에 의해 유지되지만 count()여러 번 호출 할 경우 보유하는 것이 더 빠른 것처럼 보입니다 .


답변

PHP는 배열의 크기를 내부적으로 저장하지만, 생성하지 않는 것보다 느린 경우에도 여전히 함수 호출을 수행하고 있습니다. 고리:

예를 들면

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

또한 count배열에서 호출되고 있는지 항상 확인할 수는 없습니다 . Countable예를 들어 구현하는 객체에서 호출되면 count해당 객체 의 메서드가 호출됩니다.


답변