2013-08-17 3 views
8

Когда мы делаем что-то вроде:«Следующий элемент уже занят» ошибка

<?php 
$arr = array(); 
$arr[PHP_INT_MAX] = null; 
$arr[] = null; 

PHP выдает сообщение об ошибке:

Предупреждение: Не удается добавить элемент в массив в качестве следующего элемента уже занят в /home/yca/script.php на линии

Почему двигатель говорит, что следующий элемент уже занят?

Является ли это ошибкой PHP?

+1

Не может быть, чтобы массив заполнялся от 0 до MAX целочисленного значения. И поскольку это максимум, вы не можете добавить еще один элемент в массив? – bestprogrammerintheworld

+0

Почему вы даже пытаетесь использовать 2 миллиарда элементов? –

+1

Он работает [здесь] (http://codepad.org/8fyIoxZ7). Возможно, ваша версия PHP устарела. –

ответ

4

Это буквально ответит на все ваши вопросы массивов в PHP

В основном они не являются массивами. Это карты, которые выглядят как массивы.

http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

Следующая я вытащил из текущего 5.5.2 источника:

Внутренний ULONG nNextFreeElement не будет увеличиваться больше, таким образом, давая эту ошибку

(nNextFreeElement теперь LONG_MAX который уже заняты)

от источника PHP:

if (zend_hash_next_index_insert(Z_ARRVAL_P(container), &new_zval, sizeof(zval *), (void **) &retval) == FAILURE) { 
    zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied"); 
    retval = &EG(error_zval_ptr); 
    Z_DELREF_P(new_zval); 
} 

Вот часть кода, которая, я считаю, возвращает сбой в этом случае (поскольку индекс LONG_MAX уже занят). В этом вызове флаг = HASH_NEXT_INSERT.

if ((p->nKeyLength == 0) && (p->h == h)) { 
    if (flag & HASH_NEXT_INSERT || flag & HASH_ADD) { 
     return FAILURE; 
    } 
    .... 
+0

Не могли бы вы найти сообщение фиксации для этого кода? Это объяснит причины этого. –

+0

@ Daniel, не является ли сообщение об ошибке фикцией? Даже если следующий элемент уже занят, у нас не должно быть ошибок. Он должен просто переопределить. http://php.net/manual/en/function.array.php * «Обратите внимание, что, когда определены два идентичных индекса, последний перезаписывает первый."* – Pacerier

+1

Я согласен, что сообщение об ошибке является фиктивным. После просмотра кода приложение будет терпеть неудачу, и в этом случае оно всегда будет иметь неправильное сообщение. –

Смежные вопросы