7

switchステートメントを利用するためのより良い方法を研究しているときに、このスタックオーバーフローの例を見つけました。私は似たようなことをしたかったのですが、ひねりを加えました:

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";
}

はい、ケース「a」は a に達するまでフォールスルーするため、上記は明らかに計画どおりに機能しませんbreak。コードをあまり繰り返さずにこれをエレガントに行う方法があるかどうかを知りたいだけです。

4

5 に答える 5

11

これが私がエレガントな解決策だと思うものです:

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";
}

ここで何か新しいことを発明しようとしているわけではありません。ここにいる皆さんの経験から学ぼうとしているだけです。私に答えを提供してくれたすべての人に感謝します。

于 2012-04-06T16:02:49.297 に答える
5

acaseが一致すると、PHP はそれ以降のcaseステートメントを無視し、スイッチが閉じられる ( }) か abreakが検出されるまですべてのコードを実行します。breakスイッチも終了するため、必要なことは不可能です。

于 2012-04-06T15:26:23.547 に答える
1

これは、switch ステートメントの正しい使用法ではありません。

スイッチを一連の 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";
}
于 2012-04-06T15:32:25.280 に答える
1

ANDに$statusなる方法はない= abarray

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;
    }

}

例 1

$status = array (
        "a" 
);

runSwitch($status);

出力

continue to execute code for case a only

例 2

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


runSwitch($status);

出力

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

これが役立つことを願っています

ありがとう

于 2012-04-06T15:50:10.810 に答える
0

Marc Bが言ったように、あなたがしようとしていることは(少なくともスイッチでは)できません。幸いなことに、重複したコードを削除する良い方法は、メソッドを定義することです。そうすれば、必要なときに a と b の両方に共通のコードを呼び出すことができます。

于 2012-04-06T15:38:26.400 に答える