AllesMeins: 'a' == 0, das müsste mir mal jemand erklären...

Hi,

bräuchte mal jemanden, der sich mit den Innereien von PHP auskennt. Bin gerade zufällig auf eine seltsame Verhaltensweise gestossen, die ich mir beim besten Willen nicht erklären kann.
Ich weiß, das ich dieses Problem mit einem "===" lösen kann, aber trotzdem interessiert mich wie dieses Verhalten intern zustande kommt. Folgender Versuchsaufbau:

  
$in = 'aberlalal';  
  
$array = array();  
$array[] = "Halloe";  
$array[] = "Halloe2";  
$array[] = "Halloe3";  
  
foreach($array as $key => $wert){  
if($in == $key){  
echo $in . "==" . $key . "<br />";  
break;  
}  
}  

Also ich hätte jetzt erwartet, das dieses Script gar nichts aus gibt. Aber überraschenderweise erfolgt als Ausgabe "aberlalal==0". Kann mir das jemand erklären? Wie kann denn der String "aberlalal" den gleichen Wert wie 0 haben?

Grüße

Marc

  1. Hallo Marc,

    liegt an der schwachen Typisierung von PHP. Du Vergleichst einen Integer mit einem String.
    Schau dir mal http://de3.php.net/manual/de/types.comparisons.php an, dort findest du ausführlich, was wann wie und wohin gecastet wird.

    Grüße
      David

    --
    >>Nobody will ever need more than 640k RAM!<<
    1981 Bill Gates
    1. Hi,

      kann ich irgendwie erzwingen, das beide als String verglichen werden. Das strikte Vergleichen mit === würde ich gerne vermeiden, da $a auf jeden Fall als String ankommt...

      Marc

      1. echo $begrüßung;

        kann ich irgendwie erzwingen, das beide als String verglichen werden.

        Das sollte mit einem Typecast zu hinzubekommen sein.

        echo "$verabschiedung $name";

  2. Hallo Marc,

    Wie kann denn der String "aberlalal" den gleichen Wert wie 0 haben?

    Wenn Du einen String mit einer Zahl vergleichst, wird der String in eine Zahl verwandelt; dies steht in Tabelle 15-5 des PHP-Handbuchs: http://de3.php.net/manual/en/language.operators.comparison.php. Und wie Strings zu Zahlen gewandelt werden, erfährst Du hier: http://de3.php.net/manual/en/language.types.string.php#language.types.string.conversion

    Du kannst das Problem übrigens auch ohne === umgehen (=== wird übrigens nicht zwangsläufig funktionieren), wenn Du vorher prüfst, ob $in eine Zahl ist; dazu bietet sich bspw. is_numeric ($in) oder preg_match ('/^\d+$/', $in) oder ähnliches an.

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup