7 votes

Utilisation d'un interrupteur à bascule

En recherchant de meilleures façons d'utiliser une switch j'ai trouvé ceci stackoverflow exemple. J'ai voulu faire quelque chose de similaire, mais avec un petit quelque chose en plus :

switch($status)
{
 case "a":
 case "b":
  echo "start execute code for case a and b";
 case "a":
  echo "continue to execute code for case a only";
 case "b":
  echo "continue to execute code for case b only";
 case "a":
 case "b":
  echo "complete code execution for case a and b";
 break;
 case "c":
  echo "execute code for case c";
 break;
 case "d":
  echo "execute code for case d";
 break;
 case "e":
  echo "execute code for case e";
 break;
 case "f":
  echo "execute code for case f";
 break;
 default:
  echo "execute code for default case";
}

Oui, la solution ci-dessus ne fonctionne manifestement pas comme prévu, car le cas "a" sera traversé jusqu'à ce qu'il atteigne le cas "a". break . Je voudrais juste savoir s'il y a un moyen de faire cela élégamment sans répéter trop de code.

12voto

Question Overflow Points 2375

Voici ce que je pense être une solution élégante :

switch($status)
{
 case "a":
 case "b":
  echo "start execute code for case a and b";
  if($status == "a") echo "continue to execute code for case a only";
  if($status == "b") echo "continue to execute code for case b only";
  echo "complete code execution for case a and b";
 break;
 case "c":
  echo "execute code for case c";
 break;
 case "d":
  echo "execute code for case d";
 break;
 case "e":
  echo "execute code for case e";
 break;
 case "f":
  echo "execute code for case f";
 break;
 default:
  echo "execute code for default case";
}

Je n'essaie pas d'inventer quoi que ce soit de nouveau. J'essaie simplement d'apprendre des expériences de chacun ici. Merci à tous ceux qui m'ont apporté des réponses.

6voto

Marc B Points 195501

Une fois par case est trouvé, PHP ignorera tout autre case et exécuter TOUT le code jusqu'à ce que l'interrupteur soit fermé ( } ) ou un break est rencontrée. break mettra également fin au commutateur, de sorte que ce que vous souhaitez n'est pas possible.

1voto

Colin D Points 4229

Il ne s'agit pas d'une utilisation correcte de la déclaration de commutation.

Vous devez remplacer votre commutateur par une série d'instructions "if".

if($status == a || $status == b ) {
   echo "start execute code for case a and b";
   if(status == a) {
      echo "continue to execute code for case a only";
   }
   else {
      echo "continue to execute code for case b only";   
   }
   echo "complete code execution for case a and b";
}
else if ($status == c) {
   echo "execute code for case c";  
}
...
...
else {
   echo "execute code for default case";
}

1voto

Baba Points 49157

Il n'y a pas de comment dans la volonté $status peut être = a ET b sauf s'il s'agit d'un array Je sais ce que vous voulez faire et voici ma preuve de concept

function runSwitch($status) {

    if (in_array ( "a", $status ) && in_array ( "b", $status )) {
        echo "start execute code for case a and b" . PHP_EOL;
    }

    if (in_array ( "a", $status )) {
        echo "continue to execute code for case a only" . PHP_EOL;
    }

    if (in_array ( "b", $status )) {
        echo "continue to execute code for case b only" . PHP_EOL;
    }

    if (in_array ( "c", $status )) {
        echo "execute code for case c" . PHP_EOL;
    }

    if (in_array ( "d", $status )) {
        echo "execute code for case d" . PHP_EOL;
    }

    if (in_array ( "e", $status )) {
        echo "execute code for case e" . PHP_EOL;
    }

    if (in_array ( "f", $status )) {
        echo "execute code for case f" . PHP_EOL;
    }

    if (in_array ( "c", $status ) && in_array ( "f", $status )) {
        echo "continue to execute code for case c AND f only" . PHP_EOL;
    }

}

Exemple 1

$status = array (
        "a" 
);

runSwitch($status);

Sortie

continue to execute code for case a only

Exemple 2

$status = array (
        "a" , "b"
);

runSwitch($status);

Sortie

start execute code for case a and b
continue to execute code for case a only
continue to execute code for case b only

J'espère que cela vous aidera

Gracias

0voto

Jim Points 13533

Comme l'a dit Marc B, ce que vous essayez de faire (au moins avec un interrupteur) n'est pas possible. Heureusement, un bon moyen d'éliminer le code dupliqué est de définir des méthodes, de manière à ce que le code commun à a et b puisse être appelé en cas de besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X