PHP Manual
Prev | Chapter 11. Control Structures | Next

# `switch`

The `switch` statement is similar to a series of IF statements on the same expression. In many occasions, you may want to compare the same variable (or expression) with many different values, and execute a different piece of code depending on which value it equals to. This is exactly what the `switch` statement is for.

The following two examples are two different ways to write the same thing, one using a series of `if` statements, and the other using the `switch` statement:

     if ($i == 0) {
         print "i equals 0";
     }
     if ($i == 1) {
         print "i equals 1";
     }
     if ($i == 2) {
         print "i equals 2";
     }

     switch ($i) {
         case 0:
             print "i equals 0";
             break;
         case 1:
             print "i equals 1";
             break;
         case 2:
             print "i equals 2";
             break;
     }

It is important to understand how the `switch` statement is executed in order to avoid mistakes. The `switch` statement executes line by line (actually, statement by statement). In the beginning, no code is executed. Only when a `case` statement is found with a value that matches the value of the `switch` expression does PHP begin to execute the statements. PHP continues to execute the statements until the end of the `switch` block, or the first time it sees a `break` statement. If you don't write a `break` statement at the end of a case's statement list, PHP will go on executing the statements of the following case. For example:

     switch ($i) {
         case 0:
             print "i equals 0";
         case 1:
             print "i equals 1";
         case 2:
             print "i equals 2";
     }

Here, if $i equals to 0, PHP would execute all of the print statements! If $i equals to 1, PHP would execute the last two print statements, and only if $i equals to 2, you'd get the 'expected' behavior and only 'i equals 2' would be displayed. So, it's important not to forget `break` statements (even though you may want to avoid supplying them on purpose under certain circumstances).

In a `switch` statement, the condition is evaluated only once and the result is compared to each `case` statement. In an `elseif` statement, the condition is evaluated again. If your condition is more complicated than a simple compare and/or is in a tight loop, a `switch` may be faster.

The statement list for a case can also be empty, which simply passes control into the statement list for the next case.

     switch ($i) {
         case 0:
         case 1:
         case 2:
             print "i is less than 3 but not negative";
             break;
         case 3:
             print "i is 3";
     }

A special case is the default case. This case matches anything that wasn't matched by the other cases. For example:

     switch ($i) {
         case 0:
             print "i equals 0";
             break;
         case 1:
             print "i equals 1";
             break;
         case 2:
             print "i equals 2";
             break;
         default:
             print "i is not equal to 0, 1 or 2";
     }

The `case` expression may be any expression that evaluates to a simple type, that is, integer or floating-point numbers and strings. Arrays or objects cannot be used here unless they are dereferenced to a simple type.

The alternative syntax for control structures is supported with switches. For more information, see Alternative syntax for control structures .

    switch ($i):
         case 0:
             print "i equals 0";
             break;
         case 1:
             print "i equals 1";
             break;
         case 2:
             print "i equals 2";
             break;
         default:
             print "i is not equal to 0, 1 or 2";
     endswitch;

Prev | Home | Next
`continue` | Up | require()