0

私は、複数の一致が存在する可能性がある、正確には 32 という多数のビット単位のテストを実行しようとしています。私が考えることができる唯一の方法は、ifステートメントの長いリスト全体を使用することです。

$test = 3;
if(($test & 1) == 1) {
    do something...
}
if(($test & 2) == 2) {
    do something else...
}

コードを削減するために私が考えていたもう 1 つの可能性は、switch ステートメントです。そうは言っても、私が考えていることがうまくいくかどうかさえわかりません:

$test = 3;
switch($test) {
    case ((1 & $test) == 1):
        do something...
        break;
    case ((2 & $test) == 2):
        //Will this run?
        do something else...
        break;
}

スイッチはbreak終わりますか?または、切り替えが続行され、ビットごとの操作が true を返す各ケースが実行されますか?

私の実際のプログラムには 32 の異なるテストがあり、それが機能せず、Google がこれについて何も明らかにしていないことを見つけるためだけに 32 のすべてを書きたくないので、質問します。

これが機能しない場合、解決策はありますか、それとも多数の if ステートメントに追いやられていますか?

4

2 に答える 2

1

いいえ、そうではありません。この例では、switch ケースの 1 つだけが実行されます。が検出されるとすぐにbreak、スイッチ処理は終了します。1 つのブランチのみが一致します。PHP では、最初に一致したケースが実行されると思います (ただし、再確認することをお勧めします)。

一致する可能性が複数ある場合は、一連のステートメントを使用する必要がありますif(if.​​..elseif は使用しないでください)。

私はに変換します

if($test & 1) {
    // do stuff
}

if(test & 2) {
    // do stuff
}
于 2013-09-20T15:55:56.733 に答える
0

まず、この方法で switch を使用することintはあまりお勧めできません。それは良い習慣ではありません/本当に読みにくい/快適ではありません。動作すらしていないと思いますが、今は疑問があります...バージョンやものによっては、これらのことを十分に認識していません。

次に、あなたの質問に答えるために、最初に一致するケースの中に入るだけです...その後、ブレークによりswitch を離れます。ただし、ブレークを省略すると、2 番目のケースを通過します。

とにかく、OOP をもっと活用して、何をしようとしているのかをよりよく特徴付ける必要があります。そうすれば、物事はおそらくより単純で明確になります。

于 2013-09-20T16:01:40.030 に答える