“下一个元素已被占用”错误

时间:2013-08-17 06:59:46

标签: php arrays

当我们做类似的事情时:

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

PHP提供错误消息:

  

警告:无法在数据中添加元素,因为 /home/yca/script.php 已经在 4 中占用了下一个元素>

为什么引擎会说下一个元素已被占用?

这是一个PHP错误吗?

1 个答案:

答案 0 :(得分:6)

这将完全回答你关于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;
    }
    ....