[PHP] case a conditions - C'est tout bête mais

Voila, je veux faire un truc tout bête, j’ai un switch case, et je voudrais que dans un case il y a 2 possibilitée.

Un exemple pour simplifié, je voudrais qq chose comme ca :
switch($blabla)
{
case ‘aaa’ :
do_something();
break;
case ‘bbb’ OR ‘ccc’ :
do_something_else();
break;
}

J’ai déjà essayé comme ca, et bien sur ca ne marche pas…
Si quelqu’un a la solution :confused:

C’est comme ça qu’il faut faire :

switch($blabla)
{
case 'aaa' :
    do_something();
    break;
case 'bbb': case 'ccc':
    do_something_else();
    break;
}

En fait quand le programme rentre dans un case, il continue jusqu’à la fin du switch (même si il y a un autre case d’ouvert) sauf s’il voit un break. C’est pourquoi ‘bbb’ ne fais pas rien, il continue (rentre dans le case de ‘ccc’) et fais éxécute donc aussi ‘do_something_else()’, ensuite ils sortent du switch par un break.

Tu peux également faire comme ça (mais c’est moche) :

switch(TRUE)
{
case ($blabla == 'aaa') :
   do_something();
   break;
case ($blabla == 'bbb' AND $blabla == 'ccc'):
   do_something_else();
   break;
}

pas taper :neutre:

euh si tu mets un AND ça sera toujours faux :o

Tu peux aussi la faire à la Sans Nom :


$x = array(
  'aaa' => 'do_something', 
  'bbb' => 'do_something_else', 
  'ccc' => 'do_something_else'
);
if (isset($x[$blabla]))
  call_user_func($x[$blabla]);

Et comme ça on évite le gros switch affreux tout pas beau ! :slight_smile:

tout juste :jap:

qu’est ce que t’as contre les switch, ils ont mangé ta bouillie à ta place quand tu était petit ? :o :smiley:

Dalai > tu te rappelles pas ? y’avait plein de truc comme ça dans la gestinter :smiley:


switch($blabla)
{
  case 'aaa' :
    do_something();
    break;
  case 'bbb':
  case 'ccc' :
    do_something_else();
    break;
  default:
    break;
}

tu (re)veux le code source ? :paf:

(oui, c’est le même code que kinji127, mais je trouve cette présentation plus lisible … question d’habitude après :jap: )

au fait, dans un switch, n’oublie JAMAIS de mettre un default à la fin … c’est mon prof de C qui m’avais dit ça :neutre:

le switch case c’est quand même assez acceptable :o
[:shy] on met un goto ?

mais pourquoi j’ai lu “on met une gogo” :riva:

en manque le kiss ? naaan :nexath

bouh, de l’introspection qui plante à l’execution :o
Dans tout les langages cay le mal le script introspectif/interprété à l’exécution.

patapay :paf:

edit: sans vouloir casser le débat sur la Gogo ceci dit, url?

[:eveden] :na: :o

y’a pas des bas … et d’ailleurs les gogos, je les préfères sans bas :o

(ok, jeu de mots à 2 bytes, je vais me cacher dans le "topic blogue à bade" < toi aussi, amuses-toi à remettre les lettres dans le bon ordre pour ne rien gagner :paf:)

? je vois pas où qu’il déconne mon script?

Normalement, si la gestion du switch est bien faîte, ça utilise déjà une table de hashage … mais c’est pas non plus évident.

J’ai peut-être pas capté, mais ca fait pas un AND ca ?

1- C’est bien mais si tu veux executer plusieurs fonctions, ou autres choses que des fonctions, ca marche pas.
2- En quoi switch c’est affreux et pas beau ? Explique un peu :neutre:

Dalai> NON. Ca fait un OR. Et oui, et non.

Le switch n’est qu’un vulgaire enchaînement de goto, mais qui reste plus intelligent :

Ton code donnerait en C (puisqu’il y a les gotos)

if ( $blabla == 'aaa' ) goto case_aaa;
else if ( $blabla == 'bbb' ) goto case_bbb;
else if ( $blabla == 'ccc' ) goto case_ccc;

:case_aaa
  do_something();
  goto end;
:case_bbb:
:case_ccc:
  do_something_else();
  goto end;
:end

Moralité? Ce n’est pas réellement un or :slight_smile: juste un autre cas, qui continue jusqu’au prochain break (goto end).

Ah ok, je savais pas du tout !

Donc théoriquement il vaudrais mieux faire un
if(machin)
{
}
elseif(truc)
{
}
elseif(bidule)
{
}

plutot que
switch()
{
case machin :
break;
case bidule :
break;
case truc :
break;
}

J’avais toujours pensé le contraire moi :confused:

Le if/else peut être dans bien des cas plus rapides que son homologue avec switch. Du moins, c’est ce qu’on m’a appris. Ensuite cela doit dépendre du compilo : s’il est intelligent, il devrait utiliser une table de hashage ou un autre mécanisme, ce qui rend le switch plus rapide.

Mais ce n’est pas forcèment tout le temps possible, et il y a des raisons qui fait que cela ne le soit pas.

Ceci étant je ne suis pas spécialiste en la question :slight_smile: je ne faisais que noter que le switch n’est pas forcèment mieux que le goto :wink:

Si le switch utilise du hashage, c’est aussi efficace (et tu laisse le compilo bosser à ta place).
et le script plante si le nom de fonction est mauvais à cause d’une faute de frappe etc. pour peu qu’un petit malin se soit amusé à paramétrer les nom de fonctions, ça devient imb…

c’est l’équivalent d’un Class.forname en Java: si on a pas le choix: OK, mais si on en abuse, il y a risque de plantage à l’exécution, ce qui est d’autant plus dommage qu’en mettant explicitement le nom de classe, les pbm sont résolus à la compil :wink:

Moi aussi :neutre:

il y a juste le
switch (boolean)
case true
case false

qui est stupide :smiley: (et je l’ai vu en vrai, il y avais même un case else :smiley: :smiley: )

comme c’est vendredi, je préconise que tu fasse un sondage pour ou contre le switch, moi je vote POUR à fond !
:whistle: