Switch-Case mit Mehrfach-Bedingung?

Moin,

die switch-case-Konstruktion ist ja bekannt. Normalerweise vergleiche ich dabei in jedem case-Zweig den switch-Wert mit genau einem Wert. Was aber, wenn ich ihn mit mehreren Werten vergleichen will? Aus VB kenne ich z.B. die Syntax „Case 1, 2, 3“, wodurch bei allen drei Werten in diesen Zweig eingestiegen wird.

Im Prinzip scheint das auch bei PHP zu funktionieren, indem man einfach „case 1:“, „case 2:“ und „case 3:“ untereinander schreibt, obwohl es vom Aufbau her nicht ganz einleuchtend ist. Das Problem kommt aber jetzt:

Ich lasse nach dem „3“-Zweig das „break;“ weg und frage nun noch einmal einzeln nach 1, 2 und 3 ab. Dummerweise sind nun plötzlich alle Bedingunen war, so dass immer die erste von den dreien erfolgreich durchlaufen wird.

Nichts verstanden? Wundert mich nicht :wink: Hier mal ein ähnliches Beispiel, mit dem ich u.a. das getestet hatte:

 Test-PHP
if (!isset($frmAction) or $frmAction == "") { $frmAction = "HUHU"; }
 
$arr = array(
 'eins' =\> 'One', 
 'zwei' =\> 'Two', 
 'drei' =\> 'Three', // Kommentar
 'vier' =\> 'Four', 
 'anders' =\> 'Was anderes: ' .$frmAction);
 
switch ($frmAction)
{
case "1":
 echo $arr['eins'];
 break;
case "2":
case "3":
 echo "Es ist also entweder 2 oder 3 ...
";
case "2":
 echo $arr['zwei'];
 break;
case "3":
 echo $arr['drei'];
 break;
case "4":
 echo $arr['vier'];
 break;
default:
 echo $arr['anders'];
}
?\>

Egal, ob man 2 oder 3 als Parameter verwendet - es kommt immer „Two“ dabei raus. Und wenn man das „break“ bei „2“ wegnimmt, kommt „TwoThree“ raus.

Das ist doch blöde, oder? Ich dachte, ich könnte innerhalb des switch-Blocks ein paar „gemeinsame“ Blöcke definieren, die dann im Folgenden verfeinert werden. Aber wie es aussieht, muss ich dafür separate switch-Blöcke schreiben, oder?

Falls es doch anders geht, würde ich gerne wissen, wie!

Danke und Gruß,
Kristian

Struktur?
Moin moin,

wenn Du Dir Deine Struktur ansiehst, ist es klar, dass Du das so nicht unter einen Hut bekommst. Ich würde - sofern es sich um dieses einfache Problem handelt - dann diese Lösung wählen:

switch ($frmAction){
case "1":
 echo $arr['eins'];
 break;
case "2":
case "3":
 echo "Es ist also entweder 2 oder 3 ...
";
 if ($frmAction=="2") { echo $arr['zwei']; }
 elseif ($frmAction=="3") { echo $arr['drei']; }
 break;
case "4":
 echo $arr['vier'];
 break;
default:
 echo $arr['anders'];
}

wobei ich die auch irgendwie unelegant finde :frowning:

Gruß
Christian

Naja, so ganz das, was eigentlich gedacht war, ist es nicht, stimmt. Aber ich habe inzwischen festgestellt, dass es sich in meinem Falle auch anders machen lässt, so dass sich diese Frage hier gar nicht mehr stellt.

Dafür gibt es andere Fragen … :wink:

Moin,

die switch-case-Konstruktion ist ja bekannt. Normalerweise
vergleiche ich dabei in jedem case-Zweig den switch-Wert mit
genau einem Wert. Was aber, wenn ich ihn mit mehreren Werten
vergleichen will? Aus VB kenne ich z.B. die Syntax „Case 1, 2,
3“, wodurch bei allen drei Werten in diesen Zweig eingestiegen
wird.

Im Prinzip scheint das auch bei PHP zu funktionieren, indem
man einfach „case 1:“, „case 2:“ und „case 3:“ untereinander
schreibt, obwohl es vom Aufbau her nicht ganz einleuchtend
ist.

das konzept nennt sich fallthrough und es macht sinn den als solchen zu kennzeichnen, um ihn von einem vergessenen break zu unterscheiden

> switch ($frmAction)  
> {  
> case "1":  
> echo $arr['eins'];  
> break;  
> case "2": //fallthrough  
> case "3":  
> echo "Es ist also entweder 2 oder 3 ...  
> ";  
> break; //macht nur mit diesem sinn  
> case "2":  
> echo $arr['zwei'];  
> break;  
> case "3":  
> echo $arr['drei'];  
> break;  
> case "4":  
> echo $arr['vier'];  
> break;  
> default:  
> echo $arr['anders'];  
> break; //von wegen der schoenheit  
> }

Aha, danke. � �— � �o.w.T.
o.w.T.