PHP:为什么我的开关总是选择相同的值? 函数getValue($v){ $b=22; 交换机($v){ 案例($v$b*1.2&&v1$b*2.2&&v1$b*3.2): $v1=$b*4;中断; 违约: $v1=$b; } 返回$v1; }

PHP:为什么我的开关总是选择相同的值? 函数getValue($v){ $b=22; 交换机($v){ 案例($v$b*1.2&&v1$b*2.2&&v1$b*3.2): $v1=$b*4;中断; 违约: $v1=$b; } 返回$v1; },php,switch-statement,logical-operators,Php,Switch Statement,Logical Operators,getValue(25)或getValue(45)始终返回22。您检查的变量错误,因此应在整个案例中用$v语句替换$v1。但是,switch语句被设计为接受常量值,因此最好将它们全部替换为if 此外,部分表达式是多余的,因为您已经检查了它们。在下一个表达式中检查$v$b*1.2后。您的默认子句永远无法匹配,因为$v的所有值都是$b*3.2 function getValue($v) { $b = 22; switch ($v) { case

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

您检查的变量错误,因此应在整个
案例中用
$v
语句替换
$v1
。但是,
switch
语句被设计为接受常量值,因此最好将它们全部替换为
if

此外,部分表达式是多余的,因为您已经检查了它们。在下一个表达式中检查
$v$b*1.2
后。您的
默认
子句永远无法匹配,因为
$v
的所有值都是
$b*3.2

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($v){
$b=22;

如果($v查看您的案例标签:它们是关系操作的结果,因此它们的计算结果要么为真,要么为假!
%v
将与这些布尔值进行比较。这就是为什么您观察输入案例的类似输出


开关
替换为
if
块,一切都会好起来。请检查一下您对
$v1
的使用情况;您的意思是吗?

我认为您不能那样使用开关。它需要值。它不接受布尔条件。请检查此处的
函数getValue($v){
$b=22;
交换机($v){
案例($v$b*1.2&&v$b*2.2&&v$b*3.2):
$v1=$b*4;中断;
违约:
$v1=$b;
}
返回$v1;
}
您错误地使用了
$v1
而不是
$v


上述代码将起作用。

在您的开关中,我可以在第二、第三和第四种情况下看到变量$v1,因此请考虑我们没有经过第一种情况的情况,那么变量$v1是什么?它还没有设置,所以它将变为默认情况或始终是第一种情况。

使用a,您可以根据这些情况测试给定的值


因此,您的语句确实是
$v==($v$b*1.2&&&$v1),那么原因很可能是因为您遇到了“默认值”选项,这很可能意味着在您的交换机中有一个错误/某些计算不正确。您使用的$v值是多少?您必须在您的交换机中使用
$v
,而不是
$v1
。您的代码中没有
$v1
,因此它未定义。您的代码严重混乱。我很确定您是这样做的在大多数使用$v1的地方都使用$v。就我个人而言,我建议写长而易懂的变量名,而不是像$v/$v1这样晦涩难懂的名称。Matt的答案也是有效的。你可能会在答案中添加
$v1
错误。就是这样!谢谢,祝你有一天过得愉快!乍一看,这似乎有效,这很有趣(事实上,在我阅读kawadhiya21的答案之前,这是我的第一个解决方案),因为PHP的类型强制处理方式适用于整数和布尔值。但是它对输入值
0
给出了错误的答案(
44
)。您可以通过将
开关($v)
替换为
开关(true)来解决这个问题
但它似乎有点笨拙。@MattRaines我不明白为什么0输出44,即使第一个case的计算结果应该与1的计算结果一样为true。
4v,因为它将开关值
$v
(即
0
,即
false
)依次与每个case表达式进行比较。
0$b*1.2&&0<=b*2.2)
=
false
,与
$v
相同。否,
getValue(“0”)
仍然返回
44
。这不是
switch
语句的工作方式。最好将其重写为一系列
if
elseif
else
。但是如果您确实喜欢语法,可以使用
switch(true)
。还有第二个错误(比较
$v1
而不是
$v
)。无论如何,感谢您的输入。感谢您的输入,Matt,非常感谢,我知道这很好用。
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;
    }
}
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;
    }
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;
}
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;
}