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