Есть ли 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
этого объекта.