Функция PHP count() O (1) или O (n) для массивов?

Есть ли count() действительно считать все элементы массива PHP, или это значение кэшировано где-то и только что получено?

Ответ 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 этого объекта.