Какой максимальный размер массива в 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;
Если вы сталкиваетесь с ошибками, связанными с размером массива, велики шансы, что вы делаете сумасшедшие вещи, которых вам, вероятно, следует избегать.