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

PHP: why my switch always picks the same value?

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) 总是 returns 22.

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

此外,您的部分表达式是多余的,因为您已经检查过了。在检查了 $v <= $b * 1.2 并发现它不是之后,就没有必要在下一个表达式中检查 $v > $b * 1.2 了。您的 default 子句永远无法匹配,因为 all $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;
    }
}

看看你的案例标签:它们是关系运算的结果,所以它们都评估为真或假! %v 将与这些布尔值进行比较。这就是为什么您在输入案例中观察到如此相似的输出。

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

我认为您不能那样使用 switch。它需要价值观。它不接受布尔条件。在这里查看 http://php.net/manual/en/control-structures.switch.php

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

上面的代码可以工作。

在你的开关中,我可以在第二种、第三种和第四种情况下看到变量 $v1 所以想想我们不经历第一种情况的情况那么变量 $v1 是什么?它尚未设置,所以它总是进入默认情况或第一种情况。

使用 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;
}