php - Bu geçersiz ofset türü hatasını nasıl düzeltirim


90

Ben alıyorum

geçersiz ofset türü

bu kodun her yinelemesi için hata. İşte kod:

$s = array();
for($i = 0; $i < 20; $i++){
    $source = $xml->entry[$i]->source;
    $s[$source] += 1;    
}

print_r($s)

10
Uyarı: hemen hemen tüm yanıtlar (zombat'lar hariç) bunun $sourcebir örneği olduğunu varsayar SimpleXMLve yalnızca o belirli durum için geçerli olan bilgileri sağlar. Sonunda durum böyle olsa da, soru bunu belirtmedi ve buraya referans için gelen her kimse bunu hesaba katmalı.
Álvaro González

Yanıtlar:


158

Bir nesne veya dizi kullanarak bir dizi dizinine erişmeye çalıştığınızda, geçersiz uzaklık türü hataları oluşurDizin anahtarı olarak .

Misal:

$x = new stdClass();
$arr = array();
echo $arr[$x];
//illegal offset type

Kişisel $xmldizi de bir nesne ya da dizi içeren $xml->entry[$i]->sourcebazı değer $ive sizin için bir dizin anahtarı olarak o kullanmaya çalıştığınızda $s, o uyarıyı olsun. İstediğinizi $xmliçerdiğinden ve doğru şekilde eriştiğinizden emin olmalısınız.


kaynak html içeriyor, bu sınıf bir nesne olarak mı?
Steven

Oluşturduğunuz mü $xmlXML ayrıştırıcı çeşit kullanarak değişkeni? simple_xml veya DOMDocument? Bu durumda, kaynak düğümün aslında bir tür dom öğesi nesnesi olması muhtemeldir.
zombat

simplexml_load_string kullanıyorum. bu yardımcı olur mu?
Steven

HTML'niz XML olarak ayrıştırılmış olabilir ve muhtemelen tüm etiketleriniz düğüm haline gelmiştir. Örneğin, kaynak mülkünüz olarak "<div> Merhaba </div>" HTML snippet'ine sahipseniz, muhtemelen buna benzer bir şeyiniz vardır $xml->entry[$i]->source->div. HTML'yi bir DOM yapısına ayrıştırmak istiyorsanız, HTML'yi SimpleXML'den çok daha iyi işleyen DomDocumentbir loadHTML()işleve sahiptir. Check out php.net/manual/en/domdocument.loadhtml.php
zombat

bunun için teşekkürler. Html'yi çıkarmak için str_replace kullandım ve işe yarıyor.
Steven

26

Daha trim($source)önce kullanın $s[$source].


3
Sanırım bu soru için doğru cevap , zombat için
Pmpr

5
Bir nesneyi kırpmak, onu dizeye dönüştürmenin açık olmayan bir yoludur (basit olanıdır (string)$source) ve sonuçlar tamamen __toString () uygulamasına bağlıdır . Bir SimpleXMLnesneniz varsa işe yarar (görünüşte herkes tarafından varsayılmış ancak soruda asla gerçekten belirtilmemiş bir şey).
Álvaro González

Bu sorun __toString () uygulaması ile ilgiliyse, trim () çağrısı temiz bir çözüm değildir. Kafa karıştırıcı.
Čamo

3

$ xml-> entry [$ i] var ve onun bir özelliğini almaya çalışmadan önce bir nesne olduğunu kontrol edin

 if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
   $source = $xml->entry[$i]->source;          
   $s[$source] += 1;
 }

veya $ source, geçerli bir dizi uzaklığı olmayabilir, ancak bir dizi, nesne, kaynak veya muhtemelen boş olabilir


2
Tek doğru cevap. Dizideki öğenin varlığını kontrol etmelisiniz. Mevcut değilse, özelliklerine erişemezsiniz.
RWC

0

Xml'nizde muhtemelen 20'den az girdi vardır.

kodu buna değiştir

for ($i=0;$i< sizeof($xml->entry); $i++)
...

4
Tanımsız bir tamsayı indeksi "Geçersiz uzaklık" uyarısı oluşturmaz, bunun yerine "Tanımsız dizin" E_NOTICE alırsınız.
zombat

0

Benzer bir problemim vardı. XML çocuğumdan bir Karakter aldığımda, önce onu bir String'e (veya eğer bekliyorsanız, Tamsayıya) dönüştürmek zorunda kaldım. Aşağıda sorunu nasıl çözdüğüm gösterilmektedir.

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.