php - Bagaimana cara memperbaiki kesalahan jenis offset ilegal ini

90

Saya mendapatkan

jenis offset ilegal

kesalahan untuk setiap iterasi kode ini. Berikut kodenya:

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

print_r($s)
Steven
sumber
10
Peringatan: hampir semua jawaban (kecuali zombat) menganggap itu $sourceadalah contoh SimpleXMLdan memberikan informasi yang hanya berlaku untuk situasi tertentu itu. Sementara itu pada akhirnya masalahnya, pertanyaan itu tidak menyatakannya dan siapa pun yang datang ke sini untuk referensi harus mempertimbangkan hal ini.
Álvaro González

Jawaban:

157

Kesalahan tipe offset ilegal terjadi saat Anda mencoba mengakses indeks array menggunakan objek atau array sebagai kunci indeks.

Contoh:

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

$xmlArray Anda berisi objek atau larik $xml->entry[$i]->sourceuntuk beberapa nilai $i, dan ketika Anda mencoba menggunakannya sebagai kunci indeks $s, Anda mendapatkan peringatan itu. Anda harus memastikan $xmlberisi apa yang Anda inginkan dan bahwa Anda mengaksesnya dengan benar.

zombat
sumber
sumbernya berisi html, apakah kelas itu sebagai objek?
Steven
Apakah Anda membuat $xmlvariabel menggunakan semacam pengurai XML? simple_xml atau DOMDocument? Dalam hal ini, kemungkinan besar node sumber sebenarnya adalah sejenis objek elemen dom.
zombat
Saya menggunakan simplexml_load_string. Apakah itu membantu?
Steven
HTML Anda mungkin telah diurai sebagai XML, dan kemungkinan besar semua tag Anda menjadi node. Misalnya, jika Anda memiliki cuplikan HTML "<div> Hai </div>" sebagai properti sumber, Anda mungkin memiliki sesuatu seperti $xml->entry[$i]->source->div. Jika Anda ingin mengurai HTML menjadi struktur DOM, DomDocumentmemiliki loadHTML()fungsi yang menangani HTML jauh lebih baik daripada SimpleXML. Lihat php.net/manual/en/domdocument.loadhtml.php
zombat
Terima kasih untuk itu. Saya telah menggunakan str_replace untuk menghapus html dan berhasil.
Steven
26

Gunakan trim($source)sebelumnya $s[$source].

Zafer
sumber
3
Saya pikir ini adalah jawaban yang tepat untuk pertanyaan ini, bukan dari zombat
Pmpr
5
Memangkas objek hanyalah cara yang tidak jelas untuk mentransmisikannya ke string (yang paling sederhana adalah (string)$source) dan hasilnya sepenuhnya bergantung pada implementasi __toString () -nya . Ini berfungsi jika Anda memiliki SimpleXMLobjek (sesuatu yang tampaknya diasumsikan oleh semua orang tetapi tidak pernah benar-benar dinyatakan dalam pertanyaan).
Álvaro González
Jika masalah ini terkait dengan penerapan __toString (), panggilan trim () bukanlah solusi bersih. Ini membingungkan.
Čamo
3

periksa $ xml-> entri [$ i] ada dan merupakan objek sebelum mencoba untuk mendapatkan propertinya

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

atau $ source mungkin bukan offset array legal tetapi array, objek, resource, atau mungkin null

brian_d
sumber
2
Satu-satunya jawaban yang benar. Anda harus memeriksa keberadaan elemen dalam array. Jika tidak ada, Anda tidak dapat mengakses propertinya.
RWC
0

Mungkin ada kurang dari 20 entri dalam xml Anda.

ubah kodenya menjadi ini

for ($i=0;$i< sizeof($xml->entry); $i++)
...
Byron Whitlock
sumber
4
Indeks bilangan bulat tak terdefinisi tidak menghasilkan peringatan "Pengimbangan ilegal", Anda akan mendapatkan E_NOTICE "Indeks tak terdefinisi" sebagai gantinya.
zombat
0

Saya memiliki masalah serupa. Ketika saya mendapat Karakter dari anak XML saya, saya harus mengubahnya terlebih dahulu menjadi String (atau Integer, jika Anda mengharapkannya). Berikut ini menunjukkan bagaimana saya memecahkan masalah.

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
pengguna8387356
sumber