php - ฉันจะแก้ไขข้อผิดพลาดประเภทออฟเซ็ตที่ผิดกฎหมายนี้ได้อย่างไร


90

ฉันได้รับ

ประเภทออฟเซ็ตที่ผิดกฎหมาย

ข้อผิดพลาดสำหรับการทำซ้ำทุกครั้งของรหัสนี้ นี่คือรหัส:

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

print_r($s)

10
คำเตือน: คำตอบเกือบทั้งหมด (ยกเว้น zombat) ถือว่า$sourceเป็นตัวอย่างSimpleXMLและให้ข้อมูลที่ใช้กับสถานการณ์นั้น ๆ เท่านั้น แม้ว่าจะเป็นเช่นนั้นในที่สุดคำถามก็ไม่ได้ระบุไว้และใครก็ตามที่มาที่นี่เพื่ออ้างอิงควรคำนึงถึงเรื่องนี้ด้วย
ÁlvaroGonzález

คำตอบ:


158

ข้อผิดพลาดประเภทออฟเซ็ตที่ไม่ถูกต้องเกิดขึ้นเมื่อคุณพยายามเข้าถึงดัชนีอาร์เรย์โดยใช้อ็อบเจ็กต์หรืออาร์เรย์เป็นคีย์ดัชนี

ตัวอย่าง:

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

$xmlอาร์เรย์ของคุณมีออบเจ็กต์หรืออาร์เรย์$xml->entry[$i]->sourceสำหรับค่าบางค่า$iและเมื่อคุณพยายามใช้สิ่งนั้นเป็นคีย์ดัชนี$sคุณจะได้รับคำเตือนนั้น คุณจะต้องแน่ใจว่า$xmlมีสิ่งที่คุณต้องการและคุณเข้าถึงได้อย่างถูกต้อง


ซอร์สมี html คลาสนั้นเป็นอ็อบเจ็กต์หรือไม่
Steven

คุณสร้าง$xmlตัวแปรโดยใช้ตัวแยกวิเคราะห์ XML บางประเภทหรือไม่ simple_xml หรือ DOMDocument? ในกรณีนั้นเป็นไปได้ว่าโหนดต้นทางเป็นวัตถุองค์ประกอบ Dom
zombat

ฉันใช้ simplexml_load_string มันช่วยอะไร?
Steven

HTML ของคุณอาจถูกแยกวิเคราะห์เป็น XML และมีแนวโน้มว่าแท็กทั้งหมดของคุณจะกลายเป็นโหนด ตัวอย่างเช่นถ้าคุณมี HTML ตัวอย่างของ "<div> สวัสดี </ div>" $xml->entry[$i]->source->divเป็นทรัพย์สินแหล่งที่มาของบางสิ่งบางอย่างแล้วคุณอาจมีเช่น หากคุณต้องการแยกวิเคราะห์ HTML เป็นโครงสร้าง DOM DomDocumentมีloadHTML()ฟังก์ชันที่จัดการ HTML ได้ดีกว่า SimpleXML มาก ตรวจสอบphp.net/manual/th/domdocument.loadhtml.php
zombat

ขอบคุณสำหรับสิ่งนั้น ฉันใช้ str_replace เพื่อตัด html และใช้งานได้
Steven

26

ใช้trim($source)ก่อน $s[$source].


3
ฉันคิดว่านี่เป็นคำตอบที่ถูกต้องสำหรับคำถามนี้ไม่ใช่ของ zombat
Pmpr

5
การตัดแต่งวัตถุเป็นเพียงวิธีที่ไม่ชัดเจนในการส่งไปยังสตริง (สิ่งที่ตรงไปตรงมาจะเป็น(string)$source) และผลลัพธ์ขึ้นอยู่กับการใช้งาน__toString ()ทั้งหมด ใช้งานได้ถ้าคุณมีSimpleXMLวัตถุ (สิ่งที่ทุกคนสันนิษฐาน แต่ไม่เคยระบุไว้ในคำถามจริงๆ)
ÁlvaroGonzález

หากเป็นปัญหาที่เกี่ยวข้องกับ __toString () การเรียกใช้ trim () ไม่ใช่วิธีแก้ปัญหาที่สะอาด มันสับสน
Čamo

3

ตรวจสอบ $ xml-> รายการ [$ i] มีอยู่และเป็นวัตถุก่อนที่จะพยายามรับคุณสมบัติของมัน

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

หรือแหล่งที่มาของ $ อาจไม่ใช่การชดเชยอาร์เรย์ตามกฎหมาย แต่เป็นอาร์เรย์วัตถุทรัพยากรหรืออาจเป็นค่าว่าง


2
คำตอบเดียวที่ถูกต้อง คุณต้องตรวจสอบการมีอยู่ขององค์ประกอบในอาร์เรย์ หากไม่มีอยู่คุณจะไม่สามารถเข้าถึงคุณสมบัติของมันได้
RWC

0

อาจมีน้อยกว่า 20 รายการใน xml ของคุณ

เปลี่ยนรหัสเป็นสิ่งนี้

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

4
ดัชนีจำนวนเต็มที่ไม่ได้กำหนดจะไม่สร้างคำเตือน "การชดเชยที่ไม่ถูกต้อง" คุณจะได้รับ "ดัชนีที่ไม่ได้กำหนด" E_NOTICE แทน
zombat

0

ฉันมีปัญหาที่คล้ายกัน เนื่องจากฉันได้รับตัวละครจากลูก XML ของฉันฉันต้องแปลงเป็นสตริงก่อน (หรือจำนวนเต็มถ้าคุณคาดหวัง) ต่อไปนี้แสดงให้เห็นว่าฉันแก้ไขปัญหาอย่างไร

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.