用php开关奇怪的行为?

时间:2011-07-25 10:10:15

标签: php switch-statement

我正在尝试做的一个示例将更明确:

   var_dump($opti_point); //int 0

    if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good

    switch ($opti_point) {

        case ($opti_point>= 0 && $opti_point < 25):
            $test = 0;
            break;

        case ($opti_point >= 25 && $opti_point < 50):
            echo 'we are in this case'; // This case is called !
            $test = 2;
            break;

        default:
            test = 0;
            break;
    }

这里有诀窍吗?

THX

7 个答案:

答案 0 :(得分:3)

不幸的是,你无法在“案例”中进行比较...... 仅当值可以具有有限数量的值之一时才使用开关:

switch ( $val ) {
  case 1:
    echo "Got 1";
    break;
  case 2:
    echo "Got 2";
    break;
  default:
    echo "Got invalid value";
}

解决方法是使用:

switch (true) {
    case ($opti_point>= 0 && $opti_point < 25):
        $test = 0;
        break;

    case ($opti_point >= 25 && $opti_point < 50):
        echo 'we are in this case';
        $test = 2;
        break;

    default:
        test = 0;
        break;
}

哪个会起作用,但有点难看......

此外,您在echo we are in this case';中遗漏的单引号应为echo 'we are in this case';

你应该使用if = =)

答案 1 :(得分:3)

如果您在案例中进行比较,则需要将switch参数更改为true false

答案 2 :(得分:1)

我认为使用switch语句是一种非常糟糕的方式,你不应该在这些情况下放置条件语句......事实上,我确信这在其他语言中是非法的,而且我和#39;我不确定它是否应该在PHP中运行。改为使用多个连接的if-else条件:

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

答案 3 :(得分:1)

您对switch-case的工作方式存在误解。 Case不要将您的表达测试为布尔值!

将其值与“切换”值进行比较!

以下是解释:

$opti_point>= 0 && $opti_point < 25评估为真,哪个整数表示为1,因为PHP可以自己处理类型,它将true转换为1并将其与switch中的值0进行比较

$opti_point >= 25 && $opti_point < 50的计算结果为0,整数为0,所以...就是你的情况;)

答案 4 :(得分:1)

我会和你一起实现代码

   var_dump($opti_point); //int 0 , or false  --- you should use TRUE

    if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good

    switch ($opti_point) { // chose the case that is $opti_point (0 or false)

        case ($opti_point>= 0 && $opti_point < 25): // true, so go to next
            $test = 0;
            break;

        case ($opti_point >= 25 && $opti_point < 50): //false si this is the wan I pick
            echo 'we are in this case'; // This case is called !
            $test = 2;
            break; // ingore the rest

        default:
            test = 0;
            break;
    }

你应该在开关中使用TRUE

答案 5 :(得分:1)

您没有比较您认为比较的内容。这是我认为你想要的代码。

var_dump($opti_point); //int 0

if ($opti_point>=0 && $opti_point < 25) {
    $test = 0;
    echo 'You are now here!';
} elseif ($opti_point >= 25 && $opti_point < 50) {
    $test = 2;
} else {
    test = 0;
}

在您的示例中,您正在比较逻辑语句的结果...

($opti_point>=0 && $opti_point < 25) // true

$ opti_point的值

0 // false

因此,PHP实际上将您在整数中的想法转换为布尔值,以将其与条件语句的结果进行比较。

答案 6 :(得分:1)

如果这是确切的代码,那么试试这个

var_dump($opti_point); //int 0

if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good

switch ($opti_point) {

    case ($opti_point>= 0 && $opti_point < 25):
        $test = 0;
        break;

    case ($opti_point >= 25 && $opti_point < 50):
        echo 'we are in this case'; // This case is called !
        $test = 2;
        break;

    default:
        $test = 0;
        break;
}

if ($opti_point>=0 && $opti_point < 25) echo 'good';//echoing good switch ($opti_point) { case ($opti_point>= 0 && $opti_point < 25): $test = 0; break; case ($opti_point >= 25 && $opti_point < 50): echo 'we are in this case'; // This case is called ! $test = 2; break; default: $test = 0; break; }