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.
$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.
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.
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
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);
}
$source
adalah contohSimpleXML
dan 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.Jawaban:
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
$xml
Array Anda berisi objek atau larik$xml->entry[$i]->source
untuk beberapa nilai$i
, dan ketika Anda mencoba menggunakannya sebagai kunci indeks$s
, Anda mendapatkan peringatan itu. Anda harus memastikan$xml
berisi apa yang Anda inginkan dan bahwa Anda mengaksesnya dengan benar.sumber
$xml
variabel menggunakan semacam pengurai XML? simple_xml atau DOMDocument? Dalam hal ini, kemungkinan besar node sumber sebenarnya adalah sejenis objek elemen dom.$xml->entry[$i]->source->div
. Jika Anda ingin mengurai HTML menjadi struktur DOM,DomDocument
memilikiloadHTML()
fungsi yang menangani HTML jauh lebih baik daripada SimpleXML. Lihat php.net/manual/en/domdocument.loadhtml.phpGunakan
trim($source)
sebelumnya$s[$source]
.sumber
(string)$source
) dan hasilnya sepenuhnya bergantung pada implementasi __toString () -nya . Ini berfungsi jika Anda memilikiSimpleXML
objek (sesuatu yang tampaknya diasumsikan oleh semua orang tetapi tidak pernah benar-benar dinyatakan dalam pertanyaan).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
sumber
Mungkin ada kurang dari 20 entri dalam xml Anda.
ubah kodenya menjadi ini
for ($i=0;$i< sizeof($xml->entry); $i++) ...
sumber
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); }
sumber