2010-04-28 6 views
55

Ich bekomme "Illegal Offset Type" Fehler für jede Iteration dieses Codes. Hier ist der Code für den Fall, dass jemand helfen kann:php - Wie behebe ich diesen illegalen Offset-Typ Fehler

$s = array(); 

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

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

} 

print_r($s) 

Irgendwelche Ideen. Danke im Voraus.

+2

Warnung: fast alle Antworten (außer zombat) gehen davon aus, dass '$ source' eine Instanz von' SimpleXML' ist und Informationen liefert, die nur für diese spezifische Situation gelten. Auch wenn dies schließlich der Fall war, wurde dies in der Frage nicht erwähnt, und jeder, der als Referenz hierher kommt, sollte dies berücksichtigen. –

Antwort

97

Illegal versetzem Fehler auftreten, wenn Sie versuchen, ein Array-Index für den Zugriff mit Hilfe eines Objekt oder eine Array als Indexschlüssel.

Beispiel:

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

Ihr $xml Array enthält ein Objekt oder ein Array an $xml->entry[$i]->source für einen Wert von $i, und wenn Sie versuchen, dass für $s als Indexschlüssel zu verwenden, können Sie diese Warnung. Sie müssen sicherstellen, dass $xml enthält, was Sie wollen und dass Sie richtig darauf zugreifen.

+0

die Quelle enthält HTML, tut diese Klasse als ein Objekt? – Steven

+0

Haben Sie die Variable '$ xml' mit einer Art XML-Parser erstellt? Simple_xml oder DOMDocument? In diesem Fall ist es wahrscheinlich, dass der Quellknoten tatsächlich eine Art von dom-Elementobjekt ist. – zombat

+0

Ich verwende Simplexml_load_string. Hilft das? – Steven

2

Es gibt wahrscheinlich weniger als 20 Einträge in Ihrem XML.

Änderung der Code zu diesem

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

danke, aber das ist es nicht. – Steven

+2

Ein undefinierter Ganzzahl-Index erzeugt keine Warnung "Unzulässiger Offset", stattdessen erhalten Sie einen "Undefinierten Index" E_NOTICE. – zombat

3

Scheck $ xml-> Eintrag [$ i] existiert und ist ein Objekt bevor Sie versuchen, eine Eigenschaft davon

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

oder Quelle könnte $ bekommen keine rechtliche Anordnung versetzt sein, aber ein Array, Objekt , Ressource oder möglicherweise null

+2

Die einzige richtige Antwort.Sie müssen das Vorhandensein des Elements im Array überprüfen. Wenn es nicht existiert, können Sie nicht auf seine Eigenschaften zugreifen. – RWC

13

Verwenden Sie trim($source) vor $s[$source].

+2

Ich denke, das ist die richtige Antwort für diese Frage, nicht [die von zombat] (http://stackoverflow.com/questions/2732451/php-how-do-i-fix-this-illegal-offset-type-error # answer-2732502) – Trix

+3

Trimmen eines Objekts ist nur eine nicht naheliegende Möglichkeit, es in eine Zeichenfolge umzuwandeln (die einfache wäre '(string) $ source') und das Ergebnis hängt vollständig von [__toString()] ab (http://php.net/manual/en/language.oop5.magic.php#object.tostring) Implementierung. Es funktioniert, wenn Sie ein "SimpleXML" -Objekt haben (etwas, das anscheinend von allen übernommen wurde, aber nie wirklich in der Frage angegeben wurde). –

+0

Wenn dieses Problem mit der __toString() - Implementierung zusammenhängt, ist trim() keine saubere Lösung. Es ist verwirrend. –

0

Ich hatte ein ähnliches Problem. Als ich ein Zeichen von meinem XML-Kind bekam, musste ich es zuerst in einen String umwandeln (oder Integer, wenn Sie einen erwarten). Das Folgende zeigt, wie ich das Problem gelöst habe.

foreach($xml->children() as $newInstr){ 
     $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key); 
     $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument); 
    } 
Verwandte Themen