PHP switch case more than one value in the case

81,226

Solution 1

The simplest and probably the best way performance-wise would be:

switch ($var2) {
    case 1:
    case 2:
       $var3 = 'Weekly';
       break;
    case 3:
       $var3 = 'Monthly';
       break;
    case 4:
    case 5:
       $var3 = 'Quarterly';
       break;
}

Also, possible for more complex situations:

switch ($var2) {
    case ($var2 == 1 || $var2 == 2):
        $var3 = 'Weekly';
        break;
    case 3:
        $var3 = 'Monthly';
        break;
    case ($var2 == 4 || $var2 == 5):
        $var3 = 'Quarterly';
        break;
}

In this scenario, $var2 must be set and can not be null or 0

Solution 2

switch ($var2) {
       case 1 :
       case 2 :
          $var3 = 'Weekly';
          break;
       case 3 :
          $var3 = 'Monthly';
          break;
       case 4 :
       case 5 :
          $var3 = 'Quarterly';
          break;
}

Everything after the first matching case will be executed until a break statement is found. So it just falls through to the next case, which allows you to "group" cases.

Solution 3

If You're reading this and the year is 2021 and beyond, You're also using PHP > 8.0, you can now use the new match expression for this.

this could be

$var3 = match($var2){
    1, 2    => 'Weekly',
    3       => 'Monthly',
    4, 5    => 'Quarterly',
    default => 'Annually',
};

Please note that match does identity checks, this is the same as === compared to switch equality check which is ==.

read more about match expression here

Solution 4

Switch is also very handy for A/B testing. Here is the code for randomly testing four different versions of something:

$abctest = mt_rand(1, 1000);
switch ($abctest) {
    case ($abctest < 250):
        echo "A code here";
        break;
    case ($abctest < 500):
        echo "B code here";
        break;
    case ($abctest < 750):
        echo "C code here";
        break;
    default:
        echo "D code here";
        break;
Share:
81,226
Alex Pliutau
Author by

Alex Pliutau

Updated on July 09, 2022

Comments

  • Alex Pliutau
    Alex Pliutau almost 2 years

    I have a variable that holds the values 'Weekly', 'Monthly', 'Quarterly', and 'Annual', and I have another variable that holds the values from 1 to 10.

    switch ($var2) {
        case 1:
            $var3 = 'Weekly';
            break;
        case 2:
            $var3 = 'Weekly';
            break;
        case 3:
            $var3 = 'Monthly';
            break;
        case 4:
            $var3 = 'Quarterly';
            break;
        case 5:
            $var3 = 'Quarterly';
            break;
        // etc.
    }
    

    It isn't beautiful, because my code has a lot of duplicates. What I want:

    switch ($var2) {
        case 1, 2:
            $var3 = 'Weekly';
            break;
        case 3:
            $var3 = 'Monthly';
            break;
        case 4, 5:
            $var3 = 'Quarterly';
            break;
    }
    

    How can I do it in PHP?

  • Gromski
    Gromski over 13 years
    ($var2 == 1 || $var2 == 2) may not work correctly depending on what $var2 is. If $var2 = 0 the first case will be executed. It's also a lot more verbose than the plain case style. You're also breaking a little too often.
  • Hannes
    Hannes over 13 years
    @deceze, agreed, thats why i put the other solution first, its just an example for "complex" boolean comparison
  • Gromski
    Gromski over 13 years
    If you were to use this style at all, at least do it correctly by making the condition work correctly: switch (true) { case ($a || $b) : ... }
  • Hannes
    Hannes over 13 years
    @deceze if were to do that then case 3 would no longer work, but i will ad a note
  • Alex Pliutau
    Alex Pliutau over 10 years
    Congratulate you with your first answer! But it's offtop :)