values valores repetidos repeated manejo loop length for contar columnas array_count_values array php arrays performance

valores - ¿La función count() de PHP es O(1) u O(n) para matrices?



php array length for loop (3)

Bueno, podemos ver la fuente:

/ext/standard/array.c

/ext/standard/array.c llama a php_count_recursive() , que a su vez llama a zend_hash_num_elements() para una matriz no recursiva, que se implementa de esta manera:

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

Entonces puede ver que es O(1) para $mode = COUNT_NORMAL .

Does count() realmente cuenta todos los elementos de una matriz de PHP, o es este valor almacenado en la memoria caché en alguna parte y solo se recupera?


En PHP 5+ la longitud se almacena en la matriz por lo que el recuento no se realiza cada vez.

EDITAR: También puede encontrar este análisis interesante: PHP Count Performance . Aunque la matriz mantiene la longitud de la matriz, todavía parece que es más rápido conservarla si va a llamar a count() muchas veces.


PHP almacena el tamaño de una matriz internamente, pero aún está haciendo una llamada a la función cuando es más lenta que la que no la hace, por lo que querrá almacenar el resultado en una variable si está haciendo algo así como usarlo en una lazo:

Por ejemplo,

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

Además, no siempre se puede estar seguro de que se llame al count en una matriz. Si se llama a un objeto que implementa Countable por ejemplo, se llamará al método de count de ese objeto.