如何在 PHP 中使用 switch case 'or'

Posted

技术标签:

【中文标题】如何在 PHP 中使用 switch case \'or\'【英文标题】:How to use a switch case 'or' in PHP如何在 PHP 中使用 switch case 'or' 【发布时间】:2010-09-17 10:41:58 【问题描述】:

有没有办法在 php 开关中使用“或”运算符或等效运算符?

例如,像这样的:

switch ($value) 

    case 1 || 2:
        echo 'the value is either 1 or 2';
        break;

【问题讨论】:

【参考方案1】:
switch ($value)

    case 1:
    case 2:
        echo "the value is either 1 or 2.";
    break;

这被称为“通过”案例块。该术语存在于大多数实现 switch 语句的语言中。

【讨论】:

【参考方案2】:

如果您必须将||switch 一起使用,那么您可以尝试:

$v = 1;
switch (true) 
    case ($v == 1 || $v == 2):
        echo 'the value is either 1 or 2';
        break;

如果不是,您的首选解决方案将是

switch($v) 
    case 1:
    case 2:
        echo "the value is either 1 or 2";
        break;

问题是这两种方法在处理大型案件时都效率不高……想象一下1100 这会很好用

$r1 = range(1, 100);
$r2 = range(100, 200);
$v = 76;
switch (true) 
    case in_array($v, $r1) :
        echo 'the value is in range 1 to 100';
        break;
    case in_array($v, $r2) :
        echo 'the value is in range 100 to 200';
        break;

【讨论】:

switch (true) 是一种反模式,它消除了 switch 块的唯一好处——一次评估。相反,每个案例都需要评估,并且所有break 调用都会生成一个详细的sn-p。我永远不会在专业项目中使用这种反模式。【参考方案3】:

我不会重新发布其他答案,因为它们都是正确的,但我只是补充一点,您不能将 switch 用于更“复杂”的语句,例如:测试一个值是否“大于 3 ”、“介于 4 和 6 之间”等。如果您需要这样做,请坚持使用 if 语句,或者如果对 switch 的需求特别强烈,则可以从后向前使用:

switch (true) 
    case ($value > 3) :
        // value is greater than 3
    break;
    case ($value >= 4 && $value <= 6) :
        // value is between 4 and 6
    break;

但正如我所说,我个人会在那里使用if 声明。

【讨论】:

很高兴看到您在这种情况下推荐 if() 而不是 switch()。这种开关只会增加复杂性,IMO。 是的,你必须有一个相当有说服力的理由才能选择这种风格,但很高兴知道这是可能的。 我真的很高兴了解到这一点。每次我用 Basic-y 语言构建项目时,我都会想念 C 风格的 switch(),而当我使用 C ish 语言工作时,我真的很想念 Select Case,这真的是一种速记方式说“这里有一大堆 if、else if、else-if ...”。 you can't use switch for more "complicated" statementscan't 还是 shouldn't ?因为在你的例子中你can @Sharky 他的意思是 switch 的普通用例不能。 switch (true) 这种东西可不是普通的 switch 用例。【参考方案4】:

在本文中尝试以下示例:http://phpswitch.com/

可能的切换案例:

(i)。 一个简单的 switch 语句

switch 语句奇妙而神奇。它是一种语言,允许您在值的不同选项之间进行选择,并根据设置的值运行不同的代码。

每个可能的选项都由 switch 语句中的一个 case 给出。

示例:

switch($bar)

    case 4:
        echo "This is not the number you're looking for.\n";
        $foo = 92;

(ii)。 分隔代码块

switch 的主要警告是每个 case 都会运行到下一个 case,除非你用 break 来停止它。如果将上面的简单案例扩展到案例 5:

示例:

case 4:
    echo "This is not the number you're looking for.\n";
    $foo = 92;
    break;

case 5:
    echo "A copy of Ringworld is on its way to you!\n";
    $foo = 34;
    break;

(iii)。 对多个案例使用失败

因为 switch 会一直运行代码直到找到中断,所以很容易采用 fallthrough 的概念并在多个情况下运行相同的代码:

示例:

案例2:

case 3:
case 4:
    echo "This is not the number you're looking for.\n";
    $foo = 92;
    break;

case 5:
    echo "A copy of Ringworld is on its way to you!\n";
    $foo = 34;
    break;

(iv)。 高级切换:条件案例

PHP 的开关不仅允许您打开特定变量的值:您可以使用任何表达式作为其中一种情况,只要它为要使用的情况提供值即可。例如,这是一个使用 switch 编写的简单验证器:

示例:

switch(true)

    case (strlen($foo) > 30):
        $error = "The value provided is too long.";
    $valid = false;
    break;

    case (!preg_match('/^[A-Z0-9]+$/i', $foo)):
        $error = "The value must be alphanumeric.";
    $valid = false;
    break;

    default:
    $valid = true;
    break;

我认为这可以帮助您解决问题。

【讨论】:

您有示例 (iv) 的实际用例吗? switch (true) 是一种反模式,它消除了 switch 块的唯一好处——一次评估。相反,每个案例都需要评估,并且所有break 调用都会生成详细的sn-p。我永远不会在专业项目中使用这种反模式。【参考方案5】:

试试

switch($value) 
    case 1:
    case 2:
        echo "the value is either 1 or 2";
        break;

【讨论】:

【参考方案6】:

我建议你通过switch(手动)。

switch ($your_variable)

    case 1:
    case 2:
        echo "the value is either 1 or 2.";
    break;

说明

就像你想要执行单个语句的值一样,你可以把它放在没有 break 的情况下,就像直到或除非找到 break 一样。它将继续执行代码,如果发现 break,它将退出 switch 情况。

【讨论】:

我会再次标记break,以便开发人员的眼睛可以快速追踪case 表达式。【参考方案7】:

匹配表达式 (PHP 8)

PHP 8 introduced 一个新的 match 表达式,与 switch 相似,但语法更短,但有以下区别:

不需要break 语句 使用逗号组合条件 返回一个值 具有严格的类型比较 要求比较详尽(如果未找到匹配项,将抛出UnhandledMatchError

例子:

match ($value) 
  0 => '0',
  1, 2 => "1 or 2",
  default => "3",

【讨论】:

虽然这样说是对的,但实际上与问题无关。 switch 已经提供了不止一种方法来完成 OP 想要的。 也就是说,这个页面代表了一个很好的机会来推广 PHP 中一个奇妙的、现代的替代功能。【参考方案8】:

使用此代码:

switch($a) 
    case 1:
    case 2:
        .......
        .......
        .......
        break;

块被 1 和 2 调用。

【讨论】:

【参考方案9】:

请注意,您还可以使用闭包将开关的结果(使用早期返回)分配给变量:

$otherVar = (static function($value) 
    switch ($value) 
        case 0:
            return 4;
        case 1:
            return 6;
        case 2:
        case 3:
            return 5;
        default:
            return null;
    
)($i);

当然,这种方式已经过时了,因为这正是新 PHP 8 match function 的目的,如 _dom93 答案所示。

【讨论】:

【参考方案10】:
switch ($value) 

   case 1:
   case 2:
      echo 'the value is either 1 or 2';
   break;

【讨论】:

【参考方案11】:

http://php.net/manual/en/control-structures.switch.php 示例

$today = date("D");

    switch($today)

        case "Mon":

        case "Tue":

            echo "Today is Tuesday or Monday. Buy some food.";

            break;

        case "Wed":

            echo "Today is Wednesday. Visit a doctor.";

            break;

        case "Thu":

            echo "Today is Thursday. Repair your car.";

            break;

        default:

            echo "No information available for that day.";

            break;

    

【讨论】:

default 案例不需要break【参考方案12】:

最好的方法可能是请求。此外,这可以更容易、更清晰地使用。

例子:

<?php 
$go = $_REQUEST['go'];
?>
<?php if ($go == 'general_information')?>
<div>
echo "hello";
?>

不要使用不能很好地与 PHP 配合使用的函数,尤其是当您在 html 中使用 PHP 时。

【讨论】:

以上是关于如何在 PHP 中使用 switch case 'or'的主要内容,如果未能解决你的问题,请参考以下文章

switch case的用法

在switch case语句中php开启标记之前的领先空间

PHP switch case 中多个值的情况

PHP中switch对于0的判断不准?

如何在 Scala 中使用 switch/case(简单模式匹配)?

php中switch以下输出结果为啥是1 不是0?