Frage von Plueschtier94, 64

PHP IF Anweisung - Break in den Else?

Hallo zusammen, ich habe hier eine blöde Frage. Ich möchte ein paar Zeilen sparen und frage mich demnach ob folgendes geht.

Ich habe eine IF Anweisung in der ein Switch steht. Wenn das Switch komplett durchgelaufen ist, soll im Default wenn möglich die Anweisung kommen, dass doch der Else Zweig der umfassenden IF durchgelaufen werden soll.

Ist das irgendiwe möglich?

if($test == 'test'){
         switch($test111){
             case: 111
                       echo 'Hallo Welt';
             default: 
                      gehe in den Else Zweig
         }
} else {
        switch mit anderen Überprüfungen
}
Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, Community-Experte für programmieren, 9

Normalerweise benutzt man dafür saubere Funktionen:

function foo($x) {
switch ($x) {
case 12345:
echo 'Yippiiieee!!!';
break;
default:
echo 'OMG, WTF!?!?';
}
}

function bar($x) {

switch ($x){ case 111: echo 'Hallo Welt!';
break;
case 222:
echo 'Hello World!';
break;
default: foo($x); }
}

// bisheriger modifizierter Code:
if($a == 'test'){
bar($b);
} else {
foo($c);
}

Disclaimer: Ich weiß, dass obiger Code einige Macken im Bezug auf den Stil hat, aber ich will hier niemanden überfordern! :)

Ich würde das gesamte Design nochmal überdenken. Wenn eine Funktion länger als 10 Zeilen ist, oder eine tiefere Verschachtelung als eine einzige Ebene enthält, schreit das normalerweise nach einem Refactoring!

Naja, viel Erfolg noch! ;)

Kommentar von Plueschtier94 ,

Danke für die Antwort, war zu dem Zeitpunkt schon genauso abgeändert.

Kommentar von TeeTier ,

Sehr vorbildlich! ;)

Antwort
von Suboptimierer, 35

Spontan fällt mir dazu nur ein, den else-Block in eine Funktion auszulagern und diese sowohl im else als auch im default aufzurufen. 

Ich überlege aber nochmal...

Kommentar von Suboptimierer ,
$bSonst = false;
if($test == 'test')
{
switch($test111) {
case: 111
echo 'Hallo Welt';
default:
$bSonst = true;
}
} else $bSonst = true; if($bSonst) { // switch mit anderen Überprüfungen }



Antwort
von NeoExacun, 34

Zu diesem Zeitpunkt ist das nicht mehr möglich. Dann solltest du den Code aus dem Else-Zweig in eine extra Methode packen, und diese sowol aus dem Else-Zweig als auch aus dem default-Zweig ausrufen.

Kommentar von Plueschtier94 ,

Davon bin ich auch schon ausgegangen. 
Danke für die Antwort. 

Kommentar von CounterMonkey ,

Wenns unbedingt so sein soll könnte man von hinten durch die Brust ins Auge ein Flag setzen und das ganze nochmal überprüfen, ist aaber mehr als unschön ^^

$flag = false;
if($test == 'test' && $flag == false){
switch($test111){
case: 111
echo 'Hallo Welt';
default:
$flag = true;
}
}
if($test == 'test' && $flag == true){
switch mit anderen Überprüfungen
}
Kommentar von NeoExacun ,

Kann man auch machen, sieht aber auch nicht schöner aus^^

Antwort
von LeonardM, 8

Du kannst prüfen ob der erste switch block den default wert zurückgegeben hat und wenn ja dann den nächsten durchlaufen lassen

Antwort
von tDoni, 16

Wieso so kompliziert?

if($test == 'test' && $test111 == 111 ){
echo 'Hallo Welt';
}else {
// switch mit anderen Überprüfungen
}

Nimm die zweite Überprüfung mit in die If-Abfrage. Der Rest kommt in den else-teil.

Da brauchst du keine Flags und keine zusätzlichen Methoden.

Kommentar von Plueschtier94 ,

Danke, aber das war nur eine Kurzform der Switch und deswegen ist das unpassend hier.

Mache knapp 30 Überprüfungen und weise immer verschiedene Variablen zu.

Danke dennoch. 

Kommentar von tDoni ,

Dann ist mein Vorschlag natürlich nicht optimal. Da würde ich dann ein Flag setzen und das IF-ELSE in zwei IF-Statements aufteilen:

In Etwa so:

$default = true;
if($test == 'test')
{
$default = false;
 switch($test111)
{
case: 111
echo 'Hallo Welt';
case ...
...
default:
$flag = true;
}
}

if($default)
{
// switch mit anderen Überprüfungen
}
Kommentar von Suboptimierer ,

Mal heißt dein Flag $default, mal $flag.
Vom Prinzip her aber gut gelöst.

Kommentar von tDoni ,

Stimmt, der Fehler ist mir so noch gar nicht aufgefallen, aber hier auf GuteFrage zu Coden ist auch nicht das beste ;)

Danke

Antwort
von LukasReiner, 31

Du bist nicht gezwungen ein default zu machen. Lösche den default dadurch mpsste er alle case durchchecken. trifft nichts zu geht er automatisch ins else.

Kommentar von Cr33p ,

Er geht nicht ins else. Die Bedingung $test == 'test' bleibt doch bestehen und solange geht er nicht ins else

Antwort
von Eutervogel, 37

lass das default einfach weg, wenn keins der cases passt geht er ja einfach weiter in den else Zweig.

Kommentar von Eutervogel ,

Also anstatt des defaults einfach ein break;

Kommentar von Plueschtier94 ,

Aber das Switch ist da doch vorbei? 
Dann würde der doch aktuell auch nicht in den Else Zweig laufen. 

Kommentar von Eutervogel ,

Du hast recht, ich habs mir nicht genau angeguckt :( Ich denk mal kurz drüber nach...

Kommentar von Eutervogel ,

Du könntest das ganze in ne while Schliefe packen. 

Also:

while($test == 'test'){

dann dein switch

wenn kein case passt machste aus $test im default was anderes.

Dann ist $test nicht mehr 'test' und er springt aus der Schleife...

Kommentar von Plueschtier94 ,

Auch eine sehr interessante Variante. Vielen dank für die Mühe!

Kommentar von Eutervogel ,

Und dann z.b. if($test == 'neuer Wert aus dem default'){

}

anstatt der else Anweisung, aber das ist dir sicherlich klar, ne?!

Kommentar von Eutervogel ,

Wobei mir auffällt, dass es nichtmal ne Schleife sein muss. wenn du $test änderst kannst du auch einfach ein neues if machen. Die Schleife ist ja völlig überflüssig. Aber ich bin jetzt mal still. Ich verwirr mich ja schon selber :)

Kommentar von Plueschtier94 ,

Haha vielen Dank,

und keine Sorge ist alles einleuchtend. Habe mich aber dennoch für den Weg der Funktion entschieden, da es doch knapp hundert Zeilen sind, die ich damit schön auslagern kann, und der Code übersichtlicher wird. 

Aber hier stoße ich ebenfalls an ein Problem. Vielleicht kannst du mir ja mal helfen. 

In meiner Switch, schreibe ich grundsätzlich 3 Variablen + ein Array. 
Diese muss ich natürlich wieder zurück geben. Mittels der Function list() ist das ja für die 3 Variablen kein Thema. 

Was passiert aber mit dem Array? '
Soll ich das Global bearbeiten, und ist das überhaupt möglich. 
Habe bisher immer nur mit $GLOBALS auf Variablen zugegriffen. 

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten