Dienstag, 8. August 2006

Warning Illegal offset type in... mit PHP

Heute habe ich ein bisschen mit einer XML-Datei und der PHP-Funktion simplexml_load_file arbeiten müssen. Dabei trat der Fehler: Warning Illegal offset type in... auf...

Problem

Die simplexml_load_file Funktion wirklich sehr simpel von der der Handhabung. Eine echte Erleichterung. Nun musste ich ein kleine XML-Datei mit dieser Funktion einlesen. Dabei kam es zu folgendem Fehler der eine Warnung ausgab: Warning: Illegal offset type in foo.php on line 19. Der Inhalt der XML-Datei steht in Listing 1 und der Beispielcode steht in Listing 2.


Listing 1 - XML-Datei

Download Code!

  1.  
  2. <list>
  3.         <item>
  4.                 <name>Eins</name>
  5.         </item>
  6.  
  7.         <item>
  8.                 <name>Zwei</name>
  9.         </item>
  10.  
  11.         <item>
  12.                 <name>Drei</name>
  13.         </item>
  14. </list>
  15.  
Listing 2 - foo.php

Download Code!

  1.  
  2. <?php
  3. // XML-Datei die zu laden ist
  4. $file = 'Test.xml';
  5.  
  6. // Laden der XML-Datei
  7. $xml = simplexml_load_file($file);
  8.  
  9. // Ein Array auf dessen Schlüssel zugegriffen wird.
  10. $someArray = array('Zwei' => 'Zwei ist zwei!', 'Vier' => 'Vier ist vier');
  11.  
  12. // Durchlaufen der Elemente
  13. foreach ($xml as $item) {
  14.        
  15.         // Wenn es ein Element gibt mit dem Namen zwei
  16.         if($item->name == 'Zwei') {
  17.  
  18.                 // Nutze es als Schlüssel für das Array und gib den Wert aus
  19.                 echo $someArray[$item->name];
  20.         }
  21. }
  22. ?>
  23.  

Gut, PHP sagt uns eigentlich schon was daran falsch ist. Aber vorher noch eine kleine Anmerkung. Eigentlich sollte es schon in bei der If-Anweisung vorher eine Warning geben. Das passiert aber nicht. Warum? Weil PHP sehr großzügig mit Typen und deren Werten umgeht. Sehen kann man das in Listing 3. Umgehen kann man das indem man mit einem dreifachen Gleichheitszeichen === das schreibt. Aber dazu ein andermal mehr..

Listing 3

Download Code!

  1.  
  2. <?php
  3. $x = '42';
  4. if($x == 42) {
  5.         echo 'Die Antwort ist 42.';
  6. }
  7. ?>
  8.  

Zurück zum Problem mit dem Warning Illegal offset type. PHP sagt uns das der Typ für den Schlüssel falsch ist. Wenn wir davor ein gettype setzen (Listing 4), sehen wir, dass $item->name ein Objekt ist.

Listing 4

Download Code!

  1.  
  2. <?php
  3. ...
  4. // Durchlaufen der Elemente
  5. foreach ($xml as $item) {
  6.        
  7.         // Wenn es ein Element gibt mit dem Namen zwei
  8.         if($item->name == 'Zwei') {
  9.                 // Ausgabe des Typs
  10.                 echo gettype($item->name).'<br/>';
  11.                 // Nutze es als Schlüssel für das Array und gib den Wert aus
  12.                 echo $someArray[$item->name];
  13.         }
  14. }
  15. ?>
  16.  

Lösung

Die Lösung ist recht trivial. Durch eine kleine Typkonvertierung (Cast), wird aus dem Objekt ein String und ist somit als Schlüssel nutzbar. Wir setzen also ein (string) vor das $item->name und Casten so das Objekt zu einem String. Das komplette funktionierende Script steht in Listing 5.

Listing 5

Download Code!

  1.  
  2. <?php
  3. // XML-Datei die zu laden ist
  4. $file = 'Test.xml';
  5.  
  6. // Laden der XML-Datei
  7. $xml = simplexml_load_file($file);
  8.  
  9. // Ein Array auf dessen Schlüssel zugegriffen wird.
  10. $someArray = array('Zwei' => 'Zwei ist zwei!', 'Vier' => 'Vier ist vier');
  11.  
  12. // Durchlaufen der Elemente
  13. foreach ($xml as $item) {
  14.        
  15.         // Wenn es ein Element gibt mit dem Namen zwei
  16.         if($item->name == 'Zwei') {
  17.  
  18.                 // Nutze es als Schlüssel für das Array und gib den Wert aus
  19.                 // Beachte die Typconvertierung mit (string)
  20.                 echo $someArray[(string)$item->name];
  21.         }
  22. }
  23. ?>
  24.  
Bewertung: 5 von 5, 1 Stimme(n) 5918 Klicks
Probleme und Lösungen
Von Mr.Foo in Probleme und Lösungen am 08.08.06@12:41 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

7 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Jean - #1 - 15.10.2006 00:30 - (Antwort)

Danke, das hat mir gut geholfen!

Grüesse aus Tahiti!

trka - #2 - 23.12.2006 13:00 - (Antwort)

Nachmittag gerettet. Danke!

Andreas - #3 - 02.08.2007 00:14 - (Antwort)

Super. Danke für den Artikel.

dispy - #4 - 03.09.2007 20:02 - (Antwort)

super ARbeit :-D
hat mir auch den Nachmittag gerettet :-D

Operator - #5 - 09.11.2007 16:02 - (Antwort)

Geile Scheiße. Danke.

iphone infos - #6 - 22.11.2007 14:16 - (Antwort)

Danke. Damit sieht es nun auch mit error_reporting(E_ALL); schick aus. War zu einfach, um eher gelöst zu werden.

sadi - #7 - 07.09.2009 17:24 - (Antwort)

Super! Daran hätte ich ewigs zu beissen gehabt.


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Warning Illegal offset type in... mit PHP

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen