Является ли функция PHP count () O (1) или O (n) для массивов? - PullRequest
86 голосов
/ 29 апреля 2011

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

Ответы [ 3 ]

116 голосов
/ 29 апреля 2011

Ну, мы можем посмотреть на источник:

/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.

6 голосов
/ 29 апреля 2011

В PHP 5+ длина сохраняется в массиве, поэтому подсчет не выполняется каждый раз.

РЕДАКТИРОВАТЬ: Вы также можете найти этот анализ интересным: Производительность счета PHP . Хотя длина массива поддерживается массивом, все равно кажется, что его быстрее удерживать, если вы собираетесь вызывать count() много раз.

4 голосов
/ 29 апреля 2011

PHP хранит размер массива внутри, но вы все еще делаете вызов функции, когда это происходит медленнее, чем не создание, поэтому вам нужно сохранить результат в переменной, если вы делаете что-то вроде использования это в цикле:

Например,

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

Кроме того, вы не всегда можете быть уверены, что count вызывается для массива. Если он вызывается для объекта, который реализует, например, Countable, будет вызван метод count этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...