0

コード:

switch ($_GET['operation']) {
    case "professionist":
    case "company":
    case "student":
        echo "ok<br>";

    case "professionist":
        echo "inprofessionist<br>";
        break;

    case "company":
        echo "incompany<br>";
        break;

    default:
        echo "Meh!<br>";
        break;
}

私の目標は、最初にいくつかの(専門家/会社/学生に共通の)コードを実行し、次に操作に応じて残りのコードを実行することです...

問題は、最初の 3 つのケースが完全に機能することですが、たとえば操作が「会社」である場合、スイッチは「専門家」のケースに移行します。何が間違っているのでしょうか? どうすればそれを改善できますか?前もって感謝します...

4

2 に答える 2

3

これがスイッチの仕組みです。常に「ok」を印刷する必要がある場合は、スイッチの外側に移動します。

$op = $_GET["operation"];

if (in_array($op, array("professionist", "company"))) {
   echo "ok<br>";
}

switch ($op) {
    case "professionist":
        echo "inprofessionist<br>";
        break;

    case "company":
        echo "incompany<br>";
        break;

    default:
        echo "Meh!<br>";
        break;
}
于 2012-11-27T08:32:55.977 に答える
2

case指定された値を持つ最初のものだけが。の対象になりswitchます。(実際、switch実行ごとに1つのケースにのみ適用されます。ただし、複数のケースでコードを共有することはできますが、実際にトリガーされるのはそのうちの1つだけです。)

したがって、case探しているのと同じ値を持つ複数のesを持つことは意味がありません。ステートメントは、一連の独立したsswitchと同じものではありません。ifジャンプターゲットのマッピングです。

基本的に、次のようなスイッチがあるとします。

w;                               // 001
switch ($foo) {                  // 002
  case 'a':
     w;                          // 003
  case 'b':
     x;                          // 004
     break;                      // 005
  case 'c':
     y;                          // 006
}
z;                               // 007

実際に効果的に発生するのは、次のようなコードを効果的に取得することです(注:これが実際にどのように機能するかから非常に単純化されています)。

001  v
002  jump based on $foo: [a -> 003, b -> 004, c -> 006]
003  w
004  x
005  jump to 007
006  y
007  z

そして、そのプログラムは上から下に実行されます。

  • が「a」の場合、$foo003にジャンプしてそこから実行されます。つまりv,jump,w,x,z、合計で実行することになります。
  • が「b」の場合、$foo004にジャンプしてそこから実行されます。つまりv,jump,x,z、合計で実行することになります。
  • が「c」の場合、$foo006にジャンプしてそこから実行されます。つまりv,jump,y,z、合計で実行することになります。
于 2012-11-27T08:34:32.087 に答える