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

Jes*_*alk 34 php switch-statement

所以我有四个条件需要经历,我认为最好switch在PHP中使用该语句.但是,我需要检查一个整数是否小于或等于,或大于等于.

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

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

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

    case 80:
        $priority = 'severe';
        break;
}
Run Code Online (Sandbox Code Playgroud)

随着if()语句看起来会像下面这样:

if ($count <= 20) {
    $priority = 'low';
}

if ($count <= 40) {
    $priority = 'medium';
}
Run Code Online (Sandbox Code Playgroud)

这有可能switch-case吗?

Kon*_*ess 122

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

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

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

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

    default:
        $priority = 'severe';
        break;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用脚本膨胀开关块的全部原因(IMO 的唯一原因)是对值执行一次评估并找到令人满意的情况。这个“解决方案”放弃了执行多次评估以满足“true”的好处,因此它与“if-elseif-else”块一样低效,但代码膨胀得多。我推荐像 Havenard 的计算查找这样的东西,它简洁、易于维护、高效且高度可扩展。 (6认同)

Hav*_*ard 5

开关不能这样做,但在这种特殊情况下,您可以执行以下操作:

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;
}
Run Code Online (Sandbox Code Playgroud)

因此,在(int)(($count - 1) / 20)所有值中,从 0 到 20 将 eval 为 0,21 到 40 将 eval 为 1,依此类推,允许您为此目的使用 switch 语句。

由于我们正在连接值,我们甚至可以简化为一个数组:

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

  • @mickmackusa 嗯……无论如何,我认为对代码进行未来证明是谨慎的,而不是依赖于晦涩的转换。 (3认同)
  • @Havenard 你的预言已经实现了!最好现在明确地投射它。 (3认同)

小智 5

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

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

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