2016-07-11 2 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 스위치는 스위치 케이스에서 오류/정확한 계산이 이루어지지 않았다는 것을 의미합니다. – 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 왜 '0'출력이 44인지 이해하지 못한다. 첫 번째 경우는 '4v <= $ b * 1.2'처럼 true로 평가되어야한다. 설명해 주시겠습니까? – Xatenev

2

를 반환합니다. 또한 switch 문은 상수 값을 허용하도록 설계되었으므로 모두 if으로 바꾸는 것이 좋습니다.

또한 이미 확인 했으므로 표현식의 일부가 중복됩니다. $v <= $b * 1.2을 확인한 후 찾지 못하면 다음 표현에서 $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

감사합니다. , 나는 이것이 잘 작동하는 것을 안다. – thednp

1

사례 레이블을보십시오. 관계형 연산의 결과이므로 모두가 참 또는 거짓으로 평가됩니다! %v은 이러한 부울 값과 비교됩니다. 따라서 입력 사례에 대해 이와 유사한 출력을 관찰하고있는 것입니다.

switchif 블록으로 대체하면 모두 정상입니다. 그리고 $v1의 사용을 검토하십시오. 그 뜻 이니?

+1

답에'$ v1' 실수를 추가 할 수 있습니다. – Xatenev

0

스위치에서 두 번째 및 세 번째 및 네 번째 경우에서 변수 $ v1을 볼 수 있으므로 첫 번째 경우를 통과하지 않는 조건을 생각하면 변수 $ v1은 무엇입니까? 아직 설정되지 않았으므로 항상 기본값 또는 첫 번째 경우로 이동합니다.

2

switch을 사용하면 지정된 값을 사례에 대해 테스트합니다.

는 그래서있는 거 문 $v == ($v <= $b * 1.2), $v == ($v1 > $b * 1.2 && $v1 <= $b * 2.2), 수행 등

당신은 true에 대한 스위치 및 테스트 할 수

: if/else가 더 나은 선택처럼 보인다,이 경우 그러나

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; 
} 

을 :

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

두 번째 버그 ('$ v' 대신'$ v1'을 비교)가 있습니다. –

+0

어쨌든 입력 해 주셔서 감사합니다. – thednp