-1

次のコードを見てみましょう。

if ($a == 1) {
    echo "this is stage 1";
} 
else if ($a == 2) {
    echo "this is stage 2";
}
else if ($a == 3) {
    $a = 1;
    // at this point I want something that restarts the if-else construct so
    // that the output will be "this is stage 1"
}

私は現在 if else コンストラクトに取り組んでおり、3 つのステージがあり、if-else コンストラクトが現在のステージをチェックするとしましょう。

ステージ 3 の一部のアクティビティがステージ 1 へのジャンプにつながる場合があります。これで、ステージ 1 のコードを既に渡しました。それを行う方法はありますか?さらに重要なことは、私が望むことを行うためのより良い方法はありますか? 私の考えは良い習慣とは思えないからです。

4

6 に答える 6

2

そうです、それは悪い習慣です。

を求めていgotoます。

例:

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';

上記は「Foo」を出力しません

何をしようとしているのかを正確に把握せずに、より良い方法を提案することは困難ですが、切り替えを検討してください。

switch ($a) {

 case 3:
    // Execute 3 stuff
    // No break so it'll continue to 1
 case 1:
   // Execute 1 stuff
   break // Don't go any further
 case 2:
    // 2 stuff
    break; 


}

それはおそらくあなたが望むものでもありません。

コードを関数に抽象化し、必要に応じて複数回呼び出すこともできます。

于 2013-02-01T00:48:08.360 に答える
2

if の周りに無限ループを配置し、完了したら抜け出すことができます

while (1) {
    if ($a == 1) {
        echo "this is stage 1";
        break;
    } 
    else if ($a == 2) {
        echo "this is stage 2";
        break;
    }
    else if ($a == 3) {
        $a = 1;
    }
    else {
        break;
    }
}

たぶん、 Wikipedia - Finite-state machineとこの質問PHP state machine frameworkを見たいと思うかもしれません

于 2013-02-01T00:48:11.943 に答える
1

簡単な答えは「はい」です。方法はありますが、より良い答えは、2 番目の質問にも「はい」です。

少なくとも、関数内の複数の場所から呼び出すことができるコードを配置してください。例えば、

function stageOneCode() {
    //do stuff;
}

ステージごとに機能を提案したいのですが、実際にステージで何が実行されているかを見ていないと、提案するのは難しいです。

いずれにせよ、ステージ 3 の関数の最後に、ステージ 1 の関数を呼び出すだけです。

于 2013-02-01T00:46:43.357 に答える
0

これには再帰関数が役立ちます (ただし、常に 1 に戻る場合はやり過ぎかもしれません)。

function echo_stage($stage) {
    if ($a == 1) {
        return "this is stage 1";
    } 
    else if ($a == 2) {
        return "this is stage 2";
    }
    return echo_stage(1);
}

echo echo_stage(5);

または:

switch ($number)
{
    case 2 :
        echo "this is stage 2";
        break;
    case 1:
     default:
        echo "this is stage 1"
}
于 2013-02-01T00:47:19.537 に答える
0

switch()を使用します。「デフォルト」のケースと特定のケースを使用できます。

于 2013-02-01T00:47:19.983 に答える
0

ループはあなたが探しているものです:

// initialize $a 
$a = 1;

// the while loop will return endless
while (true);

    // if you want to break for any reason use the 
    // break statement:

    // if ($whatever) {
    //    break;
    // }

    if ($a == 1) {
        echo "this is stage 1";
    }
    else if ($a == 2) {
        echo "this is stage 2";
    }
    else if ($a == 3) {
        $a = 1;
        // continue will go back to the head 
        // of the loop (step 1) early:
        continue;
    }

    // don't forget to increment $a in every loop
    $a++;
}
于 2013-02-01T00:49:00.907 に答える