"next element is already occupied" error

arrays, php

Solution

This will literally answer all your questions about arrays in php

Mostly that they are not arrays. They are maps that look like arrays.

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

The following I pulled from the current 5.5.2 source:

The internal ulong nNextFreeElement will not increment any more thus giving this error

(the nNextFreeElement is now LONG_MAX which is already occupied)

From the PHP source:

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);
}

Here is the portion of code that I believe is returning a failure in this case (since the index LONG_MAX is already occupied). In this call the flag = HASH_NEXT_INSERT.

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

Problem

When we do something like: ``` <?php $arr = array(); $arr[PHP_INT_MAX] = null; $arr[] = null; ``` PHP gives the error message: Warning: Cannot add element to the array as the next element is already occupied in /home/yca/script.php on line 4 Why does the engine say that the next element is already occupied? Is this a PHP bug?

Original source