8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 PHP‘switch’语句中使用比较运算符

Kawaii concept 2月前

37 0

我需要检查四个条件,我认为最好使用 PHP 中的 switch 语句。但是,我需要检查一个整数是否小于或等于,或者

我需要检查四个条件,我认为最好使用 switch PHP 中的语句。但是,我需要检查一个整数是否小于或等于,或者大于或等于。

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

帖子版权声明 1、本帖标题:在 PHP‘switch’语句中使用比较运算符
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Kawaii concept在本站《if-statement》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 解决这个问题的更一般的情况是:

    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 块的全部原因(在我看来,唯一原因)是执行一次值评估并找到满足条件的情况。此“解决方案”放弃了执行多次评估以满足 true 的好处,因此它与 if-elseif-else 块一样低效,但代码膨胀程度更高。我推荐 Havenard 的计算查找之类的东西,它简洁、易于维护、高效且高度可扩展。

  • 另一种解决方案仅适用于可以预先计算范围的情况。此解决方案非常适合任意选择的范围。想象一下以秒为单位的日期时间差异,您可以声明以下块:\'1 年多前\'、\'1 个月多前\'、\'几天前\'、\'昨天\'、\'几个小时前\'、\'几分钟前\'、\'几秒钟前\'、\'刚刚\'。这需要此答案中所述的解决方案。

  • 此外:除了第一个等式表达式保持不变的 if-else 链之外,switch 是什么?经典 switch( $a ){ case 3: aaa; break; case 5: bbb; break; default: zzz; break; } 实际上是 if $a == 3 do aaa, else-if $a == 5 do bbb else do zzz。此处的解决方案实际上是更紧凑的符号,即 if true == ($count <= 20) do aaa else-if true == ($count <=40) do bbb else if true == ($count <=60) do ccc else do zzz。没什么不好的,不是吗?

  • switch () 的用法很奇怪,在大多数语言中,每个 case 都必须是常量文字。PHP 支持这样做,这很奇怪。

  • gm85 2月前 0 只看Ta
    引用 7

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

    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)];
    
  • 您不需要转换为 int,因为 php 不允许浮点键 - 它们将被自动截断为整数。3v4l.org/R1kL1

  • @mickmackusa 嗯... 无论如何,我认为明智的做法是确保代码在未来得到验证,而不是依赖于模糊的转换。

  • 在 PHP 7 中,有一种方法可以使用三元赋值运算符。该运算符早在(5.4?)中就已引入,但我从未在其他版本上测试过该代码。我 在那里 ,但为了简洁起见,这里仅列出特定子句。假设我们希望条件匹配所有大于或等于五的数字:

    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') { ... }
    

    代码。没有办法将 a switch() == < 或任何其他比较运算符。它严格用于相等性测试。

  • @MacGyver 在他的解决方案中仍然在 switch 中使用 \'==\'。例如,他的代码正在检查 (($count <= 20) == true)。

  • 使用 三元运算符 :

    $priority =
        // "switch" comparison for $count
        $count <= 20 ? 'low' :
        ($count <= 40 ? 'medium' :
        ($count <= 60 ? 'high' :
        // default above 60
        'severe'));
    

    我知道人们经常抱怨三元运算符难以理解,但用一个简单的 ?: .

    其操作类似于 Excel \'If\' 公式:

    =IF( logical_test, value_if_true, value_if_false )
    
    $variable = logical_test ? value_if_true : value_if_false
    

    您还可以嵌套 if 语句(将第二个语句放在 ?: 第一个语句的“value_if_false”部分),这肯定会使阅读变得混乱,但是当您逐行写出时,情况就不会那么混乱,就像上面那样。

    OP写的语句 if() 等同

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

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

返回
作者最近主题: