2013-08-17 24 views
8

"Önümüzdeki eleman zaten işgal edilmiş" gibi bir şey:hatasını

Uyarı: Bir sonraki unsur olarak diziye eleman eklenemez

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

PHP hata mesajı verir zaten on line /home/yca/script.php yılında işgal edilmiş

Motor neden bir sonraki elemanın zaten dolu olduğunu söylüyor?

Bu bir PHP hatası mı?

+1

Dizinin 0'dan MAX tamsayı değerine kadar doldurulması mümkün olmamıştır. Ve max olduğu için dizide başka bir öğe ekleyemezsiniz? – bestprogrammerintheworld

+0

2 milyar elementi neden kullanmaya çalışıyorsunuz? –

+1

[burada] çalışır (http://codepad.org/8fyIoxZ7). PHP versiyonunuz eski olabilir. –

cevap

4

Bu anlamıyla onlar diziler değildir Çoğunlukla bu

php

dizide hakkında tüm sorularınıza cevap verecektir. Onlar diziler gibi görünen haritalar.

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

Geçerli 5.5.2 kaynağından çekilen aşağıdaki gibidir: dahili ulong nNextFreeElement daha fazla dolayısıyla bu hata

veren artmaz

(nNextFreeElement artık LONG_MAX

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); 
} 
: zaten PHP kaynağı itibaren

) işgal

İşte bu durumda bir hata döndürdüğüne inandığım kod kısmı (LONG_MAX zaten dolu olduğu için). Bu çağrıda bayrak = HASH_NEXT_INSERT.

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

Bu kod için taahhüt mesajını bulabilir misiniz? Bunun arkasındaki mantığı açıklayacağız. –

+0

@Daniel, hata mesajı bogus değil mi? Bir sonraki eleman zaten işgal edilmiş olsa bile, hatalarımız olmamalı. Sadece geçersiz kılmalı. http://php.net/manual/en/function.array.php * "İki özdeş indeks tanımlandığında, sonuncunun ilk üzerine yazıldığını unutmayın."* – Pacerier

+1

Hata mesajının bogus olduğunu kabul ediyorum. Koda baktıktan sonra, append başarısız olacak ve bu durumda her zaman yanlış bir mesaj olacaktır. –

İlgili konular