Какой максимальный размер массива в PHP?

Нам нравится хранить значения базы данных в массиве. Но мы не знаем максимальный размер массива, который разрешен в PHP?

5 ответов

Нет предела для ограничения массива. Существует ограничение на объем памяти, который может использовать ваш скрипт. Это можно изменить в "memory_limit" в вашей конфигурации php.ini.

Размер массива ограничен только объемом памяти вашего сервера. Если ваш массив становится слишком большим, вы получите ошибку "недостаточно памяти".

Мне кажется, это ограничение на 16-битное целое число со знаком. (2^15)

$ar = [];
while (array_push($ar, null)) {
    print 'a';
}

Длина вывода: 32768

Если, как и я, вам нужно использовать огромный массив в классе в PHP 5.6.40 и вы обнаружили, что существует ограничение на размер массивов классов, так что они переполняются и перезаписываются при превышении 32768 элементов, то вот Решение, которое я нашел, работает.

Создайте публичную функцию с огромным массивом в ней в качестве локальной переменной. Затем назначьте эту локальную переменную переменной класса. Вызовите эту функцию прямо в конструкторе. Вы увидите, что он печатает правильный размер массива вместо размера, оставшегося после переполнения.

class Zipcode_search {
   public $zipcodes;

   public function __construct() {
                $this->setHugeArray();
                print "size is ".sizeof($this->zipcodes). "<br />";
    }

    public function setHugeArray(){
        $zipcodes=[too much stuff];//actual array with +40,000 elements etc.
        $this->zipcodes = $zipcodes;
    }

}

2147483647 элементов даже на 64-битном PHP.(PHP 7.2.24)

В PHP,typedef struct _hashtableопределяется сuintзначения дляnTableSizeиnNumOfElements.

Из-за этого самый большой массив, который вы можете создать с помощью или кажется2^32-1предметы. Хотя ключи могут быть любыми, включая числа за пределами этого диапазона, если вы начнете с нуля с размером шага 1, ваш самый высокий индекс может быть 2147483646.

Если вы задаете этот вопрос, вы, вероятно, видели ошибку, например:

      # php -r 'array_fill(0, 2147483648, 0);'

PHP Warning:  array_fill(): Too many elements in Command line code on line 1

или даже:

      # php -r 'array_fill(0, 2147483647, 0);'

Segmentation fault (core dumped)

...или, скорее всего, ошибка, явно ссылающаяся на " максимальный размер массива ":

      php -r 'range(0,2147483647);'

PHP Warning:  range(): The supplied range exceeds the maximum array size:
start=0 end=2147483647 in Command line code on line 1

Предостережение для тех, кто читает этот вопрос:

Наиболее распространенное место, где вы столкнетесь с этим, - это неправильное использование/злоупотреблениеrange()оператор, как если бы это был итератор. В других языках он есть, но в PHP его нет: это оператор заполнения массива, как иarray_fill().

Таким образом, велики шансы, что вы можете полностью избежать использования массива. Небезопасно делать такие вещи, как:

      foreach (range($min, $max, $step)) { ... stuff ... }

Вместо этого выполните:

      for ($i = $min; $i <= $max; $i += $step) { ... stuff ... }

Точно так же я видел, как люди делали:

      // Takes 3 minutes with $min=0, $max=1e9, $step=1.
// Segfaults with slightly larger ranges.
$numItems = count(range($min, $max, $step));

Вместо этого его можно переписать более безопасным, идиоматичным и эффективным способом:

      // Takes microseconds with $min=0, $max=1e9, $step=1.
// Can handle vastly larger numbers, too.
$numItems = ($max - $min) % $step;

Если вы сталкиваетесь с ошибками, связанными с размером массива, велики шансы, что вы делаете сумасшедшие вещи, которых вам, вероятно, следует избегать.

Другие вопросы по тегам