1

For the following php program with a switch statement, why '' give me $vSS=2 instead of =1? Quite strange to me. I am using PHP 5.5.9. I can add case '': to resolve the problem, but I am curious why PHP give $vSS=2 instead of $vSS=1. Is it normal or a bug?

<?php
  R(15); // 1 ok
  R(''); // why give me 2
  R(40); // 2 ok
  R(70); // 3 ok
#
  function R($SS){
    switch($SS){
      case $SS<=20: $vSS=1;break;
      case ($SS>20 and $SS<=49.9): $vSS=2;  // why here?
        if($SS == '') echo "DEBUG: SS is a null string.<br>\n";
        break;
      case ($SS<=100 and $SS>49.9): $vSS=3; break;
      default:$vSS=0 ;
    }
    echo "DEBUG:(SS/vSS) $SS:$vSS\n";
  }
?>

------ RESULT
DEBUG:(SS/vSS) 15:1
DEBUG: SS is a null string.<br>
DEBUG:(SS/vSS) :2
DEBUG:(SS/vSS) 40:2
DEBUG:(SS/vSS) 70:3
1
  • function R()? echo "DEBUG:(SS/vSS) $SS:$vSS\n"; oh, I like it. @Barmar is right, switch - case doesn't work like this Commented Dec 29, 2014 at 10:37

2 Answers 2

2

You don't understand how switch works. It compares the value in switch($SS) with each of the case values, it doesn't just test each case. So

switch ($SS) {
case $SS<=20:

is similar to:

if ($SS == ($SS<=20))

The reason the second case is being executed is because ($SS > 20 && $SS <= 49.9) is false, and false is considered equal to zero or an empty string.

You shouldn't use switch for what you're doing, you should use if/then/elseif/else:

if ($SS <= 20) {
    $vSS = 1;
} elseif ($SS <= 49.9) {
    $vSS = 2;
} else {
    $vSS = 0;
}
Sign up to request clarification or add additional context in comments.

Comments

1

@Barmar is right, expression in case() is compared to switch(something_here) but you don't have to cahnge your all your code to if/elsif/elsif/.../... logic. Just change switch() statement to true

switch(true) { // <-- this part only
  case $SS<=20:
      $vSS=1;
      break;
  case ($SS>20 and $SS<=49.9):
    $vSS=2;  // why here?
    // must not be here
    // if($SS == '') echo "DEBUG: SS is a null string.<br>\n";
    break;
  case ($SS<=100 and $SS>49.9):
      $vSS=3; 
      break;
  case $SS=='': // you can check it here
      echo "DEBUG: SS is a null string.<br>\n";
      break;
  default:
      $vSS=0 ;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.