php - मैं इस अवैध ऑफ़सेट प्रकार त्रुटि को कैसे ठीक करूँ


90

मैं ला रहा हूँ

अवैध ऑफसेट प्रकार

इस कोड के हर पुनरावृत्ति के लिए त्रुटि। यहाँ कोड है:

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

print_r($s)

10
चेतावनी: लगभग सभी उत्तर (ज़ोम्बैट को छोड़कर) मान लेते हैं कि $sourceयह एक उदाहरण है SimpleXMLऔर जानकारी प्रदान करता है जो केवल उस विशिष्ट स्थिति पर लागू होती है। हालांकि यह अंततः मामला था, सवाल यह नहीं बताता था और जो कोई भी यहां संदर्भ के लिए आता है, उसे इसे ध्यान में रखना चाहिए।
एल्वारो गोंजालेज

जवाबों:


157

जब आप किसी ऑब्जेक्ट या किसी इंडेक्स कुंजी के रूप में एरे का उपयोग करके किसी इंडेक्स इंडेक्स तक पहुँचने का प्रयास करते हैं, तो अवैध ऑफ़सेट प्रकार की त्रुटियाँ उत्पन्न होती हैं ।

उदाहरण:

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

आपके $xmlसरणी में $xml->entry[$i]->sourceकुछ मान के लिए एक ऑब्जेक्ट या सरणी होती है $i, और जब आप उस के लिए एक इंडेक्स कुंजी के रूप में उपयोग करने का प्रयास करते हैं $s, तो आपको वह चेतावनी मिलती है। आपको यह सुनिश्चित $xmlकरना होगा कि आप इसमें क्या चाहते हैं और आप इसे सही तरीके से एक्सेस कर रहे हैं।


स्रोत में html शामिल है, क्या वह कक्षा एक वस्तु के रूप में है?
स्टीवन

क्या आपने $xmlकिसी तरह के XML पार्सर का उपयोग करके वैरिएबल बनाया है ? simple_xml या DOMDocument? उस स्थिति में, यह संभावना है कि स्रोत नोड वास्तव में किसी प्रकार का डोम तत्व है।
ज़ोम्बट

मैं simplexml_load_string का उपयोग कर रहा हूं। क्या उससे मदद हुई?
स्टीवन

हो सकता है कि आपका HTML XML के रूप में पार्स किया गया हो, और संभव है कि आपके सभी टैग नोड हो गए हों। उदाहरण के लिए, यदि आपके पास स्रोत स्रोत के रूप में "<div> Hi </ div>" का HTML स्निपेट था, तो संभवत: आपको कुछ ऐसा चाहिए $xml->entry[$i]->source->div। यदि आप HTML को DOM संरचना में पार्स करना चाहते हैं, तो DomDocumentएक loadHTML()फ़ंक्शन है जो HTML को SimpleXML से बेहतर तरीके से संभालता है। की जाँच करें php.net/manual/en/domdocument.loadhtml.php
zombat

उसके लिए धन्यवाद। मैंने html को स्ट्रिप करने के लिए str_replace का उपयोग किया है और यह काम करता है।
स्टीवन

26

trim($source)पहले का उपयोग करें $s[$source]


3
मुझे लगता है कि यह इस सवाल का सही जवाब है,
ज़ोम्बैट

5
किसी ऑब्जेक्ट को ट्रिम करना इसे स्ट्रिंग में डालने के लिए सिर्फ एक गैर-स्पष्ट तरीका है (सीधा एक होगा (string)$source) और परिणाम पूरी तरह से इसके __toString () कार्यान्वयन पर निर्भर करता है। यह काम करता है यदि आपके पास कोई SimpleXMLवस्तु है (स्पष्ट रूप से हर किसी के द्वारा ग्रहण की गई है, लेकिन वास्तव में प्रश्न में कभी नहीं कहा गया है)।
अल्वारो गोंजालेज

यदि यह समस्या है तो __toString () कार्यान्वयन कॉल ट्रिम () के साथ संबंधित नहीं है स्वच्छ समाधान नहीं है। यह उलझनभरा है।
Čआम

3

$ xml-> प्रविष्टि [$ i] मौजूद है और इसकी एक संपत्ति प्राप्त करने की कोशिश करने से पहले एक वस्तु है

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

या $ स्रोत एक कानूनी सरणी ऑफसेट नहीं हो सकता है, लेकिन एक सरणी, वस्तु, संसाधन या संभवतः रिक्त हो सकता है


2
एकमात्र सही उत्तर। आपको सरणी में तत्व के अस्तित्व की जांच करनी होगी। यदि यह मौजूद नहीं है, तो आप इसके गुणों तक नहीं पहुँच सकते।
RWC

0

आपके xml में संभवतः 20 से कम प्रविष्टियाँ हैं।

इसमें कोड बदलें

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

4
एक अपरिभाषित पूर्णांक सूचकांक "अवैध ऑफसेट" चेतावनी उत्पन्न नहीं करता है, आपको इसके बजाय "अपरिभाषित सूचकांक" E_NICEICE मिलेगा।
zombat

0

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। जैसा कि मुझे अपने XML बच्चे से एक वर्ण मिला है, मुझे इसे पहले एक स्ट्रिंग (या पूर्णांक में बदलना होगा, यदि आप एक की उम्मीद करते हैं)। निम्नलिखित दिखाता है कि मैंने समस्या को कैसे हल किया।

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.