ฉันได้รับ
ประเภทออฟเซ็ตที่ผิดกฎหมาย
ข้อผิดพลาดสำหรับการทำซ้ำทุกครั้งของรหัสนี้ นี่คือรหัส:
$s = array();
for($i = 0; $i < 20; $i++){
$source = $xml->entry[$i]->source;
$s[$source] += 1;
}
print_r($s)
ฉันได้รับ
ประเภทออฟเซ็ตที่ผิดกฎหมาย
ข้อผิดพลาดสำหรับการทำซ้ำทุกครั้งของรหัสนี้ นี่คือรหัส:
$s = array();
for($i = 0; $i < 20; $i++){
$source = $xml->entry[$i]->source;
$s[$source] += 1;
}
print_r($s)
คำตอบ:
ข้อผิดพลาดประเภทออฟเซ็ตที่ไม่ถูกต้องเกิดขึ้นเมื่อคุณพยายามเข้าถึงดัชนีอาร์เรย์โดยใช้อ็อบเจ็กต์หรืออาร์เรย์เป็นคีย์ดัชนี
ตัวอย่าง:
$x = new stdClass();
$arr = array();
echo $arr[$x];
//illegal offset type
$xml
อาร์เรย์ของคุณมีออบเจ็กต์หรืออาร์เรย์$xml->entry[$i]->source
สำหรับค่าบางค่า$i
และเมื่อคุณพยายามใช้สิ่งนั้นเป็นคีย์ดัชนี$s
คุณจะได้รับคำเตือนนั้น คุณจะต้องแน่ใจว่า$xml
มีสิ่งที่คุณต้องการและคุณเข้าถึงได้อย่างถูกต้อง
$xml
ตัวแปรโดยใช้ตัวแยกวิเคราะห์ XML บางประเภทหรือไม่ simple_xml หรือ DOMDocument? ในกรณีนั้นเป็นไปได้ว่าโหนดต้นทางเป็นวัตถุองค์ประกอบ Dom
$xml->entry[$i]->source->div
เป็นทรัพย์สินแหล่งที่มาของบางสิ่งบางอย่างแล้วคุณอาจมีเช่น หากคุณต้องการแยกวิเคราะห์ HTML เป็นโครงสร้าง DOM DomDocument
มีloadHTML()
ฟังก์ชันที่จัดการ HTML ได้ดีกว่า SimpleXML มาก ตรวจสอบphp.net/manual/th/domdocument.loadhtml.php
ใช้trim($source)
ก่อน $s[$source]
.
(string)$source
) และผลลัพธ์ขึ้นอยู่กับการใช้งาน__toString ()ทั้งหมด ใช้งานได้ถ้าคุณมีSimpleXML
วัตถุ (สิ่งที่ทุกคนสันนิษฐาน แต่ไม่เคยระบุไว้ในคำถามจริงๆ)
ตรวจสอบ $ xml-> รายการ [$ i] มีอยู่และเป็นวัตถุก่อนที่จะพยายามรับคุณสมบัติของมัน
if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
$source = $xml->entry[$i]->source;
$s[$source] += 1;
}
หรือแหล่งที่มาของ $ อาจไม่ใช่การชดเชยอาร์เรย์ตามกฎหมาย แต่เป็นอาร์เรย์วัตถุทรัพยากรหรืออาจเป็นค่าว่าง
อาจมีน้อยกว่า 20 รายการใน xml ของคุณ
เปลี่ยนรหัสเป็นสิ่งนี้
for ($i=0;$i< sizeof($xml->entry); $i++)
...
ฉันมีปัญหาที่คล้ายกัน เนื่องจากฉันได้รับตัวละครจากลูก XML ของฉันฉันต้องแปลงเป็นสตริงก่อน (หรือจำนวนเต็มถ้าคุณคาดหวัง) ต่อไปนี้แสดงให้เห็นว่าฉันแก้ไขปัญหาอย่างไร
foreach($xml->children() as $newInstr){
$iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
$arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
}
$source
เป็นตัวอย่างSimpleXML
และให้ข้อมูลที่ใช้กับสถานการณ์นั้น ๆ เท่านั้น แม้ว่าจะเป็นเช่นนั้นในที่สุดคำถามก็ไม่ได้ระบุไว้และใครก็ตามที่มาที่นี่เพื่ออ้างอิงควรคำนึงถึงเรื่องนี้ด้วย