PHP:为什么我的开关总是选择相同的值?

时间:2016-07-11 07:16:40

标签: php switch-statement logical-operators

function getValue($v) {
        $b = 22;
        switch ($v) {
            case ($v <= $b * 1.2):
                $v1 = $b;   break;
            case ($v1 > $b * 1.2 && $v1 <= $b * 2.2):
                $v1 = $b * 2;   break;
            case ($v1 > $b * 2.2 && $v1 <= $b * 3.2):
                $v1 = $b * 3;   break;
            case ($v1 > $b * 3.2):
                $v1 = $b * 4;   break;
            default:
                $v1 = $b;
        }
        return $v1;
    }

getValue(25)getValue(45)始终返回22.

6 个答案:

答案 0 :(得分:4)

我不认为你可以使用这样的开关。它需要价值观。它不接受布尔条件。点击http://php.net/manual/en/control-structures.switch.php

答案 1 :(得分:3)

function getValue($v) {
        $b = 22;
        switch ($v) {
            case ($v <= $b * 1.2):
                $v1 = $b;   break;
            case ($v > $b * 1.2 && $v <= $b * 2.2):
                $v1 = $b * 2;   break;
            case ($v > $b * 2.2 && $v <= $b * 3.2):
                $v1 = $b * 3;   break;
            case ($v > $b * 3.2):
                $v1 = $b * 4;   break;
            default:
                $v1 = $b;
        }
        return $v1;
    }

您错误地使用$v1而不是$v

以上代码可以使用。

答案 2 :(得分:2)

您正在检查错误的变量,因此您应该在$v1语句中将$v替换为case。此外,switch语句旨在接受常量值,因此您最好用if替换它们。

此外,您的部分表达式是多余的,因为您已经检查过它们。在检查$v <= $b * 1.2并发现它不是之后,无需在下一个表达式中检查$v > $b * 1.2。您的default子句永远无法匹配,因为$v所有值均为<= $b * 3.2> $b * 3.2

function getValue($v) {
    $b = 22;
    if ($v <= $b * 1.2) {
        return $b;
    } elseif ($v <= $b * 2.2) {
        return $b * 2;
    } elseif ($v <= $b * 3.2) {
        return $b * 3;
    } else {
        return $b * 4;
    }
}

答案 3 :(得分:2)

使用switch,您可以针对案例测试给定值。

所以你的陈述是$v == ($v <= $b * 1.2)$v == ($v1 > $b * 1.2 && $v1 <= $b * 2.2)等。

您可以针对true进行切换和测试:

function getValue($v) {
    $b = 22;
    switch (true) {
        case ($v <= $b * 1.2):
            $v1 = $b;   break;
        case ($v1 > $b * 1.2 && $v1 <= $b * 2.2):
            $v1 = $b * 2;   break;
        case ($v1 > $b * 2.2 && $v1 <= $b * 3.2):
            $v1 = $b * 3;   break;
        case ($v1 > $b * 3.2):
            $v1 = $b * 4;   break;
        default:
            $v1 = $b;
    }
    return $v1;
}

但在这种情况下,if / else似乎是更好的选择:

function getValue($v) {
    $b = 22;
    if ($v <= $b * 1.2) {
        $v1 = $b;
    } elseif ($v1 > $b * 1.2 && $v1 <= $b * 2.2) {
        $v1 = $b * 2;
    } elseif ($v1 > $b * 2.2 && $v1 <= $b * 3.2) {
        $v1 = $b * 3;
    } elseif ($v1 > $b * 3.2) {
        $v1 = $b * 4;
    } else {
        $v1 = $b;
    }

    return $v1;
}

答案 4 :(得分:1)

查看你的案例标签:它们是关系操作的结果,所以它们都评估为真或假! %v将与这些布尔值进行比较。这就是你为输入案例观察这种类似输出的原因。

switch替换为if块,一切都会好的。并检查您对$v1的使用情况;你是说那个意思吗?

答案 5 :(得分:0)

在你的开关中我可以在第二个和第三个和第四个案例中看到变量$ v1,所以想想我们不会经历第一个案例的条件那么变量$ v1那么是什么?它还没有设置,所以它始终是案例默认或第一种情况。