在 PHP“switch”语句中使用比较运算符

问题描述 投票:0回答:7

我需要满足四个条件,我认为最好在 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
吗?

php switch-statement
7个回答
180
投票

解决此问题的更一般情况是:

switch (true) {
    case $count <= 20:
        $priority = 'low';
        break;

    case $count <= 40:
        $priority = 'medium';
        break;

    case $count <= 60:
        $priority = 'high';
        break;

    default:
        $priority = 'severe';
        break;
}

12
投票

开关不能做到这一点,但在这种特殊情况下,你可以这样做:

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)];

9
投票

有一种方法可以在 PHP 7 中使用三元赋值运算符。该运算符是在(5.4?)之前引入的,但我从未在其他版本上测试过该代码。我写了整个开关代码there,但是为了简洁起见,这里只是特定的子句。假设我们希望条件匹配所有大于或等于 5 的数字:

switch($value){
    case ($value >= 5 ? $value : !$value): // Do something here
    break;
}

我们要么允许 $value 不变地传递,要么根据条件否定该值。 $value 将始终与自身匹配或无法通过其否定测试。


2
投票

不。

switch()
语句用于进行多个相等测试。它们基本上只是稍微更容易阅读(但也更危险)的

版本
if (x == 'a') { ... }
else if (x == 'b') { ... } 
else if (x == 'c') { ... }

代码。无法将

switch()
==
更改为
<
或任何其他比较运算符。它严格用于平等测试。


2
投票

使用三元运算符:

$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()
语句。


0
投票

对于 PHP >= 8

$priority = match ($count%20) {
    1=>'low',
    2=>'medium',
    3=> 'high',
    default=>'none'
}

-1
投票

我也可以确认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';
}

我承认这不是最干净的代码,所以也许用类似静态的纯函数包装每个案例会让事情变得更整洁,并且不要忘记命名每个函数(或创建一个带参数的通用函数)与案例相符。这将使它更具可读性。

© www.soinside.com 2019 - 2024. All rights reserved.