4

PHPのswitchケースに問題があります。

$ number = 0に設定すると、最初のケースで実行されるはずですが、ここでは、このコードは2番目のケースである10〜20Kを返します。

私は比較演算子をチェックし、そうでない場合は正しい値を返すかどうかをテストしましたが、ここでは最初のケースは$ number=0では実行されません

なぜこうなった ?phpは0をコードの誤りまたは何か間違っていると見なしますか?

コードパッドペーストへのリンクhttp://codepad.org/2glDh39K

ここにもコードがあります

<?php

$number = 0;

    switch ($number) {
     case ($number <= 10000):
            echo "0-10K";
           break;
        case ($number > 10000 && $number <= 20000):
            echo "10-20K";
            break;
        case ($number > 20000 && $number <= 30000):
            echo "20-30K";
            break;
        case ($number > 30000 && $number <= 40000):
            echo "30-40K";
            break;
        case ($number > 40000 && $number <= 50000):
            echo "40-50K";
            break;
        case ($number > 50000 && $number <= 60000):
            echo "50-60K";
            break;
        case ($number > 60000 && $number <= 70000):
            echo "60-70K";
            break;
        case ($number > 70000 && $number <= 80000):
            echo "70-80K";
            break;
        case ($number > 80000 && $number <= 90000):
            echo "80-90K";
            break;
        case ($number > 90000):
            echo "90K+";
            break;

        default: //default
            echo "N/A";
            break;
}

?>
4

7 に答える 7

6

あなたはほとんど逆に使用していますが、完全switchではありません。あなたは書くことによって完全に逆に入る必要がありますswitch(true)

switch (true) { // IMPORTANT CHANGE HERE!
    case ($number <= 10000):
        echo "0-10K";
       break;
    case ($number > 10000 && $number <= 20000):
        echo "10-20K";
        break;
    // etc
}

または、全体をif/に変更しelseます。

if ($number <= 10000) {
    echo "0-10K";
else if ($number > 10000 && $number <= 20000) {
    echo "10-20K";
}
// etc

2つの重要な注意事項:

  1. リバースswitchは通常、最初に見たときにひどく直感に反しているように見えます。違和感のある方はご使用にならないでください。
  2. 条件文は単純化できます。順番に表示されると仮定すると、前の条件文( )のチェックがすでに失敗しているため、各$number > X部分が冗長になります。$number <= Xただし、チェックを維持すると、変更に直面してもコードがより堅牢になると主張できます。
于 2012-09-30T09:38:18.843 に答える
4
switch ($number) {
 case ($number <= 10000):   // check $number == ($number <= 10000)
       echo "0-10K";
       break;
 // you hit the below because `0 == false` is true in php
 case ($number > 10000 && $number <= 20000): // check $number == ($number > 10000 && $number <= 20000)
        echo "10-20K";
        break;
 // ...

しかし、より少ないコードでそれを行うことができます:

function showRange($number) {
    if ($number > 90000) {
       echo "90K+";
       return;
    }
    echo sprintf("%s-%sK", (int) ($number / 10000) * 10, ((int) ($number / 10000) +1) * 10 );
}
于 2012-09-30T09:38:48.030 に答える
3

switch caseメソッドを実行する場合、そのようなブール値と照合することはできません。結果の値を比較するだけで済みます。

if...then...elseifステートメントを使用するようにコードを書き直す必要があると思います。

if ($number <= 10000){
  echo "0-10K";
}elseif($number <= 20000){
  echo "10-20K";
}elseif($number <= 30000){
  echo "20-30K";
}elseif($number <= 40000){
  ...
}

ifこの方法を使用すると、前のステートメントでこれらの条件もチェックされるため、毎回2つのチェックを行う必要はありません。IE:2番目のステートメントに到達した場合、値は小さくない(または等しい)ので、。より大きくなければならないifことはすでにわかっています。100010000

于 2012-09-30T09:35:55.680 に答える
3
$number = 0;
var_dump($number); // int(0)

ステートメントをに変更するとcase ($number > 0 && $number <= 10000):、奇妙に機能します。ただし、入力された任意のルックアップ($number > 9091 && $number <= 10000)で機能します。

以下の完全なボルロックでも:

$number = 0;
$jonskeet = false;

switch ($number)
{
    case ($jonskeet === true && $number <= 10000):
        echo "0-10K";
        // ...

ステートメント0-10K内の同じ条件が機能しない場合でも、出力されます。if

問題は、select長い条件文では使用されないことです。変数の値がキーワードの後の値と等しいselect場合に、何かを行うために使用できます。見る:case

select ($user_rank)
{
    case 0:
        return "guest";
        break;
    case 1:
        return "user";
        break;
    // ...
    default:
        return "unknown";
        break;
}

caseしかし、コードのsには長い条件があります。

case ($number <= 10000):
    echo "0-10K";
    break;
case ($number > 10000 && $number <= 20000):
    echo "10-20K";
    break;

これを最初に実行すると、2つのステートメントのように、 TRUEFALSEに変換$number <= 10000されます。この後、コードは次のように実行されます。$number > 10000 && $number <= 20000

case TRUE:
    echo "0-10K";
    break;
case FALSE:
    echo "10-20K";
    break;

$numberですが0、それも評価できFALSEます。これが、望ましくない出力が得られる理由です。

解決策として、コードを変換してif---elseifセットアップを行う必要がありelseます。

 if ( $number < 10000 ) {
     echo "0-10K";
 } else if ( $number > 10000 && $number <= 20000 ) {
     echo "10-20K";
 // ...
 } else {
     echo "N/A";
 }
于 2012-09-30T09:45:55.180 に答える
1

ここで、$ iが0に等しい場合、PHPはすべてのechoステートメントを実行します。

したがって、次のケースのステートメントを実行し、その場合はブレークアウトがあります

したがって、switchcaseの代わりにif-else-ifを使用してください

if ($number <= 10000){
  echo "0-10K";
}elseif(  $number <= 20000){
  echo "10-20K";
}elseif(  $number <= 30000){
  echo "20-30K";
}elseif(  $number <= 40000){
  echo "90K+";
}

 ...

elseif(  $number <= 90000)
     echo "80-90K";

}elseif($number > 90000){
echo "90K+";
}
于 2012-09-30T09:39:52.057 に答える
1

はい、PHPの場合0FALSE(を使用しない限り===)です。そして、はい、あなたのコードは正しくswitchありません-範囲を比較するためのものではありません-それは値を比較するためのものです(少なくともPHPでは、RubyまたはPerl 6では別の問題です)。

switch ($letter) {
case 'a':
    echo "A?";
    break;
default:
    echo "Unknown letter";
    break;
}

あなたの場合、あなたは数を条件と比較します-それらは戻るtruefalse。そのまま、 2番目の条件0falseキャッチされます。switchそのようなコードのために作られたのではなく、if else代わりに使用するか、ロジックを書き直します-繰り返すのは良い考えではありません。

$range_number = floor($number / 1000);
echo $range_number, $range_number ? "K" : "", "-", $range_number + 1, "K";

(ちなみに、私はそれが機能することを知ってswitch (true)いますが、それを使用しないでください-それは醜いハックです)

于 2012-09-30T09:41:01.743 に答える
0

ある範囲の数値に対して実際に大文字小文字を切り替えることはできません。この目的には、if(){}else{}を使用してください。

于 2012-09-30T09:42:52.900 に答える