Есть ли count() действительно считать все элементы массива PHP, или это значение кэшировано где-то и только что получено?
Функция PHP count() O (1) или O (n) для массивов?
Ответ 1
Ну, мы можем посмотреть на источник:
/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.
Ответ 2
В PHP 5+ длина сохраняется в массиве, поэтому подсчет не выполняется каждый раз.
EDIT: Вы также можете найти этот анализ интересным: Производительность подсчета PHP. Хотя длина массива поддерживается массивом, все равно кажется, что он быстрее удерживает его, если вы много раз вызываете count().
Ответ 3
PHP хранит размер массива внутренне, но вы все равно выполняете вызов функции, когда он медленнее, чем не делает его, поэтому вы хотите сохранить результат в переменной, если вы делаете что-то вроде использования он в цикле:
Например,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Кроме того, вы не всегда можете быть уверены, что count вызывается в массиве. Если он вызывает объект, реализующий Countable, например, будет вызываться метод count этого объекта.