2010-04-28 14 views
55

मुझे इस कोड के प्रत्येक पुनरावृत्ति के लिए "अवैध ऑफ़सेट प्रकार" त्रुटि मिल रही है। अगर कोई मदद कर सकता है तो कोड यहां दिया गया है:php - मैं इस अवैध ऑफ़सेट प्रकार त्रुटि को कैसे ठीक करूं

$s = array(); 

for($i = 0; $i < 20; $i++){ 

    $source = $xml->entry[$i]->source; 
    $s[$source] += 1; 

} 

print_r($s) 

कोई भी विचार। अग्रिम में धन्यवाद।

+2

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

उत्तर

97

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

उदाहरण:

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

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

+0

स्रोत में एचटीएमएल है, क्या वह वर्ग किसी ऑब्जेक्ट के रूप में करता है? – Steven

+0

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

+0

मैं simplexml_load_string का उपयोग कर रहा हूं। क्या उससे मदद हुई? – Steven

2

शायद आपके एक्सएमएल में 20 से कम प्रविष्टियां हैं।

परिवर्तन इस

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

धन्यवाद लेकिन यह ऐसा नहीं है। – Steven

+2

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

3

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

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

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

+2

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

13

उपयोग trim($source)$s[$source] से पहले।

+2

मुझे लगता है कि यह इस सवाल का सही जवाब है, [ज़ोंबैट का नहीं] [http://stackoverflow.com/questions/2732451/php-how-do-i-fix-this-illegal-offset-type-error # answer-2732502) – Trix

+3

किसी ऑब्जेक्ट को ट्रिम करना स्ट्रिंग पर डालने का एक गैर-स्पष्ट तरीका है (सीधा वाला एक '(स्ट्रिंग) $ स्रोत' होगा) और परिणाम पूरी तरह से इसके [__toString()] (http://php.net/manual/en/language.oop5.magic.php#object.tostring) कार्यान्वयन। यह काम करता है यदि आपके पास 'SimpleXML' ऑब्जेक्ट है (कुछ स्पष्ट रूप से सभी द्वारा माना जाता है लेकिन वास्तव में प्रश्न में वास्तव में कभी नहीं बताया गया है)। –

+0

यदि यह समस्या __toString() कार्यान्वयन कॉल ट्रिम() से संबंधित है, तो साफ़ समाधान नहीं है। यह उलझनभरा है। –

0

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

foreach($xml->children() as $newInstr){ 
     $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key); 
     $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument); 
    } 
संबंधित मुद्दे