繁体   English   中英

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)始终返回22。

我认为您不能使用这样的开关。 它需要价值。 它不接受布尔条件。 在这里检查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

上面的代码将起作用。

您正在检查错误的变量,因此在整个case语句中应将$v1替换$v1 $v 而且, 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;
    }
}

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

看一下您的案例标签:它们是关系运算的结果,所以它们的总和为true或false! %v将与这些布尔值进行比较。 这就是为什么您在输入案例中观察到类似的输出的原因。

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

在您的开关中,我可以在第二,第三和第四种情况下看到变量$ v1,因此请考虑一下我们不通过第一种情况的情况,那么变量$ v1呢? 它尚未设置,因此总是默认情况或第一种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM