在PHP开关中使用比较运算符

时间:2014-07-17 20:23:56

标签: php switch-statement

所以我需要经历四个条件,我认为最好在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';
}

if ($count <= 40) {
    $priority = 'medium';
}

这可以在switch-case吗?

6 个答案:

答案 0 :(得分:109)

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

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

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

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

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

答案 1 :(得分:3)

交换机无法做到这一点,但在这种特殊情况下,您可以执行以下操作:

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之间的所有值将eval为0,21到40将eval为1,依此类推,允许您为此目的使用switch语句。

由于我们是连接值,我们甚至可以简化为数组:

$priorities = ['low', 'medium', 'high', 'severe'];
$priority = $priorities[(int)(($count - 1) / 20)];

答案 2 :(得分:3)

有一种方法适用于使用三元赋值运算符的php 7。操作员之前已经介绍过(5.4?)但我从未测试过其他版本的代码。我编写了整个切换代码there,但为简洁起见,这只是具体的条款。让我们说我们希望条件匹配所有大于或等于五的数字:

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

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

答案 3 :(得分:0)

没有。 switch()语句用于执行多个相等测试。

基本上只是一个稍微容易阅读(但也更危险)的版本
if (x == 'a') { ... }
else if (x == 'b') { ... } 
else if (x == 'c') { ... }

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

答案 4 :(得分:0)

使用三元运算符怎么办?

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

答案 5 :(得分:-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';
}

我会承认这不是最干净的代码,因此也许用类似静态的纯函数包装每种情况将使事情变得整洁,并且不要忘记为每个函数命名(或使用参数创建一个泛型函数) )以匹配大小写。这将使其更具可读性。