是否可以使用带表达式的switch语句作为案例?

是否可以使用带表达式的switch语句作为案例?

问题描述:

Using if and elseif, it is possible to easily perform the comparison below, but for learning purposes I am analyzing if it is possible to have the same functionality using switch.

If $x receives a positive or negative value, I get the right output, but if $x receives 0 (zero), I get the output 'Lower', but the right output should be 'Equal'.

Here is the code:

$x = 0;

switch($x)
{
    case ($x < 0):
        echo 'Lower';
        break;

    case ($x == 0):
        echo 'Equal';
        break;

    case ($x > 0):
        echo 'Bigger';
        break;
    default:
        echo 'Not found';
}

Is it possible to use a switch statement with expressions as cases?

You are effectively not matching numbers any more, but matching the boolean outcome.

Any positive or negative number casts to boolean true and only 0 casts to false, so basically for a positive or negative number you are comparing true to ($x < 0) or ($x > 0) and that gives the outcome you expect.

However, 0 casts to false and (0 == 0) is true so you will never have a match there. And as 0 < 0 is also false, your first statement in the switch is matched.

switch($x) replace it with switch(true)

You are comparing if the $x is equal to test results, when $x = 0, the boolean value of $x is false. If it is different from 0, it is true. That's why you will always fall to the first test that returns false.

Try this instead :

$x = 0;

switch($x)
{

case 0:
    echo 'Equal';
    break;

case ($x < 0):
    echo 'Lower';
    break;

case ($x > 0):
    echo 'Bigger';
    break;

default:
    echo 'Not found';

}

I also read in the comments that you want to know if it possible to use sentences in each case of the switch. Yes it is possible :

$x = 0;

switch($x)
{

case ($x < 0):
    echo 'Lower';
    break;

case ($x > 0):
    echo 'Bigger';
    break;

case ($x <> 0):
    echo 'Equal';
    break;

default:
    echo 'Not found';

}

($x <> 0) will return false when $x = 0 and it will echo "Equal"