Zur Navigation

PHP Array mit ungültigem Index ergibt keinen Fehler?

1 Rudy

Hallo,

eigentlich dachte ich, in punkto PHP hätte ich schon so ziemlich alles gesehen, aber das hier kam mir erst jetzt unter - und ich verstehe das Verhalten nicht.

<?php
   error_reporting(E_ALL);
   $test = array(
     1 => 'Test1',
     2 => 'Test2'
   );
   echo $test[1]['wischiwaschi'];  
?>

Das Ergibt nicht, was ich erwarten würde, 'undefined index...' etc, sondern 'T'! Eine isset($test[1]['wischiwaschi']) - Prüfung ergibt true. Ist das ein Bug oder so gewollt? Wenn das so gewollt ist, erkenne ich den Sinn im Verhalten nicht. Meine PHP ist Version 5.2.1.

Ich meine, wenn ich einen Buchstaben aus $test[1] wollte, z.B. das 's', dann würde ich das doch so schreiben wollen: echo $test[1]{2};
Aber ich bekomme 's' auch so: echo $test[1][2]; $test[1]['wischiwaschi'] ist gleichbedeutend mit $test[1][0] oder $test[1]{0}... Ist das schon immer so gewesen?

Edit: ich habs nun abgeändert und prüfe mittels is_array, array_key_exists und strlen. Funktioniert, ist jedoch viel umständlicher als eine isset-Prüfung...

23.09.2007 19:58 | geändert: 23.09.2007 20:29

2 Jörg Kruse

PHP verhielt sich auch in Version 4.4.7 so - ist also wohl kein Bug. Ich schätzw, das Verhalten ist in der automatischen Typenumwandlung begründet: 'Test2' wird wegen des Kontextes in ein Array umgewandelt und 'wischiwaschi' aus dem gleichen Grunde in ein Integer

23.09.2007 20:54 | geändert: 23.09.2007 20:55

3 Rudy

Und die Buchstaben eines Strings lassen sich auch daraus wie aus einem Array lesen... Das kann verwirrend sein. Schade, dass sich das nicht unterbinden lässt.

error_reporting(E_ALL);
$test = 'Test';
if (isset($test['wischiwaschi'])) {
  echo $test['wischiwaschi'];
} 
Dass das 'T' ergibt würde ich nicht erwarten. "Principle of least surprise" ist das für mich jedenfalls nicht :) Gut, ich behalte also die umfangreicheren Prüfungen...

error_reporting(E_ALL);
$test = 'Test';
if (is_array($test) && array_key_exists('wischiwaschi', $test) && strlen($test['wischiwaschi'])) {
  echo $test['wischiwaschi'];
}
Danke.

23.09.2007 21:51 | geändert: 23.09.2007 21:55

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]