2013-08-17 29 views
8

Khi chúng ta làm điều gì đó như:"phần tử tiếp theo đã được chiếm đóng" lỗi

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

PHP cung cấp cho các thông báo lỗi:

Warning: Không thể thêm yếu tố để các mảng như phần tử tiếp theo đã bị chiếm đóng trong /home/yca/script.php trên dòng

Tại sao động cơ nói rằng phần tử tiếp theo đã bị chiếm đóng?

Đây có phải là lỗi PHP không?

+1

Không thể là mảng được lấp đầy từ 0 đến MAX giá trị nguyên. Và bởi vì nó tối đa bạn không thể thêm một phần tử khác trong mảng? – bestprogrammerintheworld

+0

Tại sao bạn thậm chí cố gắng sử dụng 2 tỷ phần tử? –

+1

Nó hoạt động [ở đây] (http://codepad.org/8fyIoxZ7). Có thể là phiên bản PHP của bạn cũ. –

Trả lời

4

Điều này nghĩa đen sẽ trả lời tất cả câu hỏi của bạn về mảng trong php

Chủ yếu là chúng không phải là mảng. Chúng là những bản đồ giống như mảng.

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

Sau đây tôi kéo từ 5.5.2 nguồn hiện tại:

Các ulong nNextFreeElement nội bộ sẽ không tăng bất kỳ như vậy, hơn đưa ra lỗi này

(các nNextFreeElement tại là LONG_MAX đó là đã bị chiếm đóng)

Từ nguồn 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); 
} 

Đây là phần mã mà tôi tin là trả lại lỗi trong trường hợp này (vì chỉ mục LONG_MAX đã bị chiếm đóng). Trong cuộc gọi này, cờ = HASH_NEXT_INSERT.

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

Bạn có thể tìm thấy thông báo cam kết cho mã đó không? Điều đó sẽ giải thích lý do đằng sau nó. –

+0

@Daniel, không phải là thông báo lỗi không có thật? Ngay cả khi phần tử tiếp theo đã bị chiếm đóng, chúng ta cũng không có lỗi. Nó chỉ nên ghi đè lên. http://php.net/manual/en/function.array.php * "Lưu ý rằng khi hai chỉ mục giống hệt nhau được xác định, thì ghi đè đầu tiên cuối cùng."* – Pacerier

+1

Tôi đồng ý rằng thông báo lỗi là không có thật. Sau khi xem mã, phần chắp thêm sẽ không thành công và trong trường hợp này, nó sẽ luôn có thông báo sai. –

Các vấn đề liên quan