switch rückgabe fraglich
lvl
- php
0 dedlfix0 Tom0 Christoph Jeschke
Hallo,
wenn ich folgender Funktion den Wert 0 übergebe, erhalte ich in meinem Array:
Mo, Montag
statt
So, Sonntag
Funktion:
function GermanDayOfWeek($value)
{
$array = array();
switch($value)
{
case 1:
case "Mon":
$array["kurz"] = "Mo";
$array["lang"] = "Montag";
break;
case 2:
case "Tue":
$array["kurz"] = "Di";
$array["lang"] = "Dienstag";
break;
case 3:
case "Wed":
$array["kurz"] = "Mi";
$array["lang"] = "Mittwoch";
break;
case 4:
case "Thu":
$array["kurz"] = "Do";
$array["lang"] = "Donnerstag";
break;
case 5:
case "Fri":
$array["kurz"] = "Fr";
$array["lang"] = "Freitag";
break;
case 6:
case "Sat":
$array["kurz"] = "Sa";
$array["lang"] = "Samstag";
break;
case 0:
case 7:
case "Sun":
$array["kurz"] = "So";
$array["lang"] = "Sonntag";
break;
default:
$array["kurz"] = "F";
$array["lang"] = "Fehler";
}
return $array;
}
print_r(GermanDayOfWeek(0));
Warum?
echo $begrüßung;
wenn ich folgender Funktion den Wert 0 übergebe, erhalte ich in meinem Array:
Mo, Montag statt So, Sonntag
case 1:
case "Mon":
Warum?
Du übergibst einen Integer-Wert. Das switch hat mit "Mon" einen Stringwert zum vergleichen. Der String wird zunächst implizit in einen Integer gecastet. (int)"Mon" ergibt 0, die Bedingung stimmt. Vergleiche dazu die PHP type comparison tables. Ein Typecast des übergebenen Wertes nach String hilft. Außerdem müssen die jetzigen Integer-case-Werte als String notiert werden, sonst ergibt ein unbekannter String-Wert Sonntag statt Fehler.
echo "$verabschiedung $name";
Hello,
Du übergibst einen Integer-Wert. Das switch hat mit "Mon" einen Stringwert zum vergleichen.
Ach ja, an der Stelle :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Ja das klingt logisch. Nach dem ich die Zahlen auch als String geschrieben habe und die übergebene Variable as String caste klappts :)
Danke
Hello,
print_r(GermanDayOfWeek('0'));
Warum?
Weil der Datentyp an irgendeiner Stelle in einen String umgewandelt wird.
Frag mich nicht, warum, darüber muss ich noch einen Moment nachdenken.
Jedenfalls funktioniert deine Switchanweisung, wenn Du ausschließlich Strings vergleichst, also auch
case '1':
usw. fragst. Ich habs extra mal umgebaut.
Das Mischen von Datentypen im Übergabeparameter halte ich sowieso für etwas schmuddelig...
Aber denken wir erst noch ein wenig drüber nach :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Guten Tag,
Warum?
Gegenfrage: Warum verwendest du nicht strftime() und setlocale()? Die dreibuchstabige Ausgabe von %a kannst du ja auf zwei Zeichen kürzen.
Gruß
Christoph Jeschke