【问题标题】:Conditional switch statements in PHPPHP 中的条件 switch 语句
【发布时间】:2011-12-09 17:06:40
【问题描述】:

我已经习惯了 vb.net 的 Select Case 语法,它本质上是一个 switch 语句,你可以在其中执行 Case Is > 5 之类的操作,如果匹配,它将执行这种情况。

由于我不知道 PHP 中的实际名称,我该如何执行我将称之为“条件切换语句”的操作?

或者,有什么快速的方法来管理这个?

switch($test)
{
    case < 0.1:
        // do stuff
        break;
}

这是我目前尝试过的。

【问题讨论】:

  • 您必须使用if-elseif-else。 PHP 不支持这种语法。
  • 案例只允许标量值。

标签: php switch-statement


【解决方案1】:

我试图将此作为评论添加到 BoltCock 的答案中,但 SO 告诉我他的答案已被锁定,所以我将把它作为一个单独的(并且基本上是多余的)答案:

来自 BoltCock 的“switch(true)”答案很像 the following example,虽然在逻辑上等同于 if + else if + else 可以说更漂亮,因为条件表达式是垂直对齐的,并且是标准/公认的做法PHP。

但是 if + else if + else 语法在脚本语言中基本上是通用的,因此任何人都可以立即阅读(和维护),这也让我点头。

【讨论】:

    【解决方案2】:

    您可以在 PHP 8.0+ 中使用 match statements 完成此操作。

    如果您的 switch 语句中只有一个表达式,则它等效于以下 match 语句。请注意,与 switch 语句不同,我们可以选择返回一个变量(在这段代码中,我将结果存储在 $result 中)。

    $test = 0.05;
    $result = match (true) {
        $test < 0.1 => "I'm less than 0.1",
        $test < 0.01 => "I'm less than 0.01",
        default => "default",
    };
    
    var_dump($result);
    

    Match 仅允许您在右侧有一个表达式(=&gt; 之后的所有内容)。与多行 case 的 switch 语句等效的是使用单独的函数。

    function tinyCase(){}
    function veryTinyCase(){}
    function defaultCase(){}
    
    $test = 0.01;
    match (true) {
        $test < 0.1 => tinyCase(),
        $test < 0.1 => veryTinyCase(),
        default => defaultCase(),
    };
    

    作为参考,如果你只是想检查是否相等,你可以这样做:

    $result = match ($test) { // This example shows doing something other than match(true)
        0.1 => "I'm equal to 0.1",
        0.01 => "I'm equal to 0.01",
        default => "default",
    };
    

    Match 语句与 switch 语句确实有一些您需要注意的关键区别:

    • 我的最后一个示例将使用严格的相等检查 === 而不是松散的 ==
    • 如果未提供默认情况,则在没有匹配项时会引发 UnhandledMatchError 错误。
    • 如果您忘记添加break,也不用担心会进入下一个案例。

    【讨论】:

      【解决方案3】:

      我认为您正在寻找类似的东西(这不是您想要的,或者至少我理解的是您的需要)。

      switch (true) 查找评估为真值的情况,并执行其中的代码,直到第一次中断;它遇到了。

      <?php
      
      switch (true) {
      
      case ($totaltime <= 1):
      echo "That was fast!";
      break;
      
      case ($totaltime <= 5):
      echo "Not fast!";
      break;
      
      case ($totaltime <= 10):
      echo "That's slooooow";
      break;
      }
      
      ?>
      

      【讨论】:

      • @BoltClock: true 做了什么?
      • 我可以在布尔表达式中安全地使用浮点数吗?
      • @Cyclone 是的,你也可以使用 float。
      • @Cyclone 超级旧,但开关中的true 告诉开关始终运行。就像while (true) {...}
      • 这与常规的 switch 语句并没有什么不同。 true 只是一个值,就像一个变量保存一个值一样。 switch 只是检查 case 以找到第一个具有相同指定值的 case。
      【解决方案4】:

      PHP 支持switch statements。这是你想要的吗?

      【讨论】:

      • 不,我知道正常的开关秒数。
      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多