2016-07-11 10 views
0
function getValue($v) { 
     $b = 22; 
     switch ($v) { 
      case ($v <= $b * 1.2): 
       $v1 = $b; break; 
      case ($v1 > $b * 1.2 && $v1 <= $b * 2.2): 
       $v1 = $b * 2; break; 
      case ($v1 > $b * 2.2 && $v1 <= $b * 3.2): 
       $v1 = $b * 3; break; 
      case ($v1 > $b * 3.2): 
       $v1 = $b * 4; break; 
      default: 
       $v1 = $b; 
     } 
     return $v1; 
    } 

getValue(25)またはgetValue(45)は常に、あなたが間違った変数をチェックしている22

+0

あなたが「デフォルト」オプションを使用している可能性が高いr switchは、スイッチのケースで正しく計算されていないエラーまたは何かがある可能性が最も高いと考えられます。 – Epodax

+0

どのような$ v値で試してみましたか? –

+2

'$ v1'の代わりに' $ v'を使用しなければなりません。あなたのコードには '$ v1'がありませんので、未定義です。 – Xatenev

答えて

3
function getValue($v) { 
     $b = 22; 
     switch ($v) { 
      case ($v <= $b * 1.2): 
       $v1 = $b; break; 
      case ($v > $b * 1.2 && $v <= $b * 2.2): 
       $v1 = $b * 2; break; 
      case ($v > $b * 2.2 && $v <= $b * 3.2): 
       $v1 = $b * 3; break; 
      case ($v > $b * 3.2): 
       $v1 = $b * 4; break; 
      default: 
       $v1 = $b; 
     } 
     return $v1; 
    } 

あなた誤って代わりに$v$v1を使用して、ここで確認してください。

上記のコードは動作します。

+0

これはそれです!ありがとう、良い一日を! – thednp

+0

PHPの型強制が整数とブール値で動作する方法のため、一見、これはうまくいくように見えます(実際、kawadhiya21の解答を読むまで私の最初の解決策でした)。しかし、それは入力値 '0'に対して間違った答え(' 44')を与えます。 'switch($ v)'を 'switch(true)'に置き換えることでこれを修正できますが、ちょっとぎこちないようです。 –

+0

@MattRaines '4v <= $ b * 1.2'のように、最初のケースが真であると評価されたとしても、なぜ0が出力されるのか理解していません。あなたはそれを説明できますか? – Xatenev

2

を返します。しかし、switchステートメントは定数値を受け入れるように設計されているため、すべてをifに置き換える方がよいでしょう。

また、あなたが既にチェックしているため、式の一部が重複しています。​​を確認した後、それが見つからない場合は、次の式の$v > $b * 1.2を確認する必要はありません。 すべての値が$vの場合、default句は一致しません。<= $b * 3.2または> $b * 3.2です。

function getValue($v) { 
    $b = 22; 
    if ($v <= $b * 1.2) { 
     return $b; 
    } elseif ($v <= $b * 2.2) { 
     return $b * 2; 
    } elseif ($v <= $b * 3.2) { 
     return $b * 3; 
    } else { 
     return $b * 4; 
    } 
} 
+0

Mattさん、ありがとう私はこれがうまく動作することを知っている。 – thednp

1

あなたのケースラベルを見てください:それらは関係演算の結果であるため、すべてが真または偽と評価されます。 %vはこれらのブール値と比較されます。そのため、あなたの入力事例に似たような出力を観察しているのです。

switchifブロックに置き換えると、すべて正常に動作します。あなたの使用方法を確認してください。$v1;あなたはそれを意味しましたか?

+1

あなたの答えに '$ v1'という間違いを追加するかもしれません。 – Xatenev

0

あなたのスイッチで私は変数$ v1を2番目と3番目と4番目のケースで見ることができるので、最初のケースを通らない条件を考えると、変数$ v1とは何ですか?まだ設定されていないので、デフォルトまたは最初のケースに常に入ります。

2

switchを指定すると、指定した値がケースに対してテストされます。

だからしている文は、あなたがtrueに対してスイッチとテストを行うことができます$v == ($v <= $b * 1.2)$v == ($v1 > $b * 1.2 && $v1 <= $b * 2.2)など

を行います。

function getValue($v) { 
    $b = 22; 
    switch (true) { 
     case ($v <= $b * 1.2): 
      $v1 = $b; break; 
     case ($v1 > $b * 1.2 && $v1 <= $b * 2.2): 
      $v1 = $b * 2; break; 
     case ($v1 > $b * 2.2 && $v1 <= $b * 3.2): 
      $v1 = $b * 3; break; 
     case ($v1 > $b * 3.2): 
      $v1 = $b * 4; break; 
     default: 
      $v1 = $b; 
    } 
    return $v1; 
} 

しかし、この場合にif/elseは、より良い選択のように思えます:

function getValue($v) { 
    $b = 22; 
    if ($v <= $b * 1.2) { 
     $v1 = $b; 
    } elseif ($v1 > $b * 1.2 && $v1 <= $b * 2.2) { 
     $v1 = $b * 2; 
    } elseif ($v1 > $b * 2.2 && $v1 <= $b * 3.2) { 
     $v1 = $b * 3; 
    } elseif ($v1 > $b * 3.2) { 
     $v1 = $b * 4; 
    } else { 
     $v1 = $b; 
    } 

    return $v1; 
} 
+0

2番目のバグがあります( '$ v'ではなく' $ v1'を比較します)。 –

+0

とにかく入力していただきありがとうございます。 – thednp

関連する問題

 関連する問題