我需要满足四个条件,我认为最好在 PHP 中使用
switch
语句。但是,我需要检查一个整数是否小于或等于,或者大于并等于。
switch ($count) {
case 20:
$priority = 'low';
break;
case 40:
$priority = 'medium';
break;
case 60:
$priority = 'high';
break;
case 80:
$priority = 'severe';
break;
}
使用
if()
语句,它将如下所示:
if ($count <= 20) {
$priority = 'low';
} elseif ($count <= 40) {
$priority = 'medium';
} elseif ($count <= 60) {
$priority = 'high';
} else {
$priority = 'severe';
}
这可以在
switch-case
吗?
解决此问题的更一般情况是:
switch (true) {
case $count <= 20:
$priority = 'low';
break;
case $count <= 40:
$priority = 'medium';
break;
case $count <= 60:
$priority = 'high';
break;
default:
$priority = 'severe';
break;
}
开关不能做到这一点,但在这种特殊情况下,你可以这样做:
switch ((int)(($count - 1) / 20)) {
case 0:
$priority = 'low';
break;
case 1:
$priority = 'medium';
break;
case 2:
$priority = 'high';
break;
case 3:
$priority = 'severe';
break;
}
因此,在
(int)(($count - 1) / 20)
中,从 0 到 20 的所有值都将评估为 0,21 到 40 将评估为 1 等等,允许您使用 switch 语句来实现此目的。
由于我们连接值,我们甚至可以简化为数组:
$priorities = ['low', 'medium', 'high', 'severe'];
$priority = $priorities[(int)(($count - 1) / 20)];
有一种方法可以在 PHP 7 中使用三元赋值运算符。该运算符是在(5.4?)之前引入的,但我从未在其他版本上测试过该代码。我写了整个开关代码there,但是为了简洁起见,这里只是特定的子句。假设我们希望条件匹配所有大于或等于 5 的数字:
switch($value){
case ($value >= 5 ? $value : !$value): // Do something here
break;
}
我们要么允许 $value 不变地传递,要么根据条件否定该值。 $value 将始终与自身匹配或无法通过其否定测试。
不。
switch()
语句用于进行多个相等测试。它们基本上只是稍微更容易阅读(但也更危险)的 版本
if (x == 'a') { ... }
else if (x == 'b') { ... }
else if (x == 'c') { ... }
代码。无法将
switch()
从 ==
更改为 <
或任何其他比较运算符。它严格用于平等测试。
使用三元运算符:
$priority =
// "switch" comparison for $count
$count <= 20 ? 'low' :
($count <= 40 ? 'medium' :
($count <= 60 ? 'high' :
// default above 60
'severe'));
我知道人们普遍抱怨三元运算符可能很难理解,但这用简单的
?:
来实现太容易了。
它的运作方式类似于 Excel“如果”公式:
=IF( logical_test, value_if_true, value_if_false )
$variable = logical_test ? value_if_true : value_if_false
并且您可以嵌套 if 语句(在第一个语句的“value_if_false”部分中放置第二个
?:
),这肯定会导致阅读混乱,但当您逐行写出它时,情况就不那么混乱了线,如上。
我上面的代码基本上相当于OP写的
if()
语句。
对于 PHP >= 8
$priority = match ($count%20) {
1=>'low',
2=>'medium',
3=> 'high',
default=>'none'
}
我也可以确认bytepunk的答案这里是有效的。
此外,用 PHP 7 扩展这个概念:
switch ($interval->days)
{
case 0:
return '1 day';
// break;
case (($interval->days >= 1 && $interval->days <= 7) ?? $interval->days):
return '1 week';
// break;
case (($interval->days >= 8 && $interval->days <= 31) ?? $interval->days):
return '1 month';
// break;
case (($interval->days >= 31 && $interval->days <= 93) ?? $interval->days):
return '2-3 months';
// break;
default:
return '3+ months';
}
我承认这不是最干净的代码,所以也许用类似静态的纯函数包装每个案例会让事情变得更整洁,并且不要忘记命名每个函数(或创建一个带参数的通用函数)与案例相符。这将使它更具可读性。