【问题标题】:PHP switch statement with $_GET variables带有 $_GET 变量的 PHP switch 语句
【发布时间】:2014-04-13 20:39:07
【问题描述】:

像这样的页面:PHP switch case $_GET's variables and switch case $_GET's variable's values 和其他页面有所帮助,但我不知道为什么我的 switch 语句不起作用。

用户可能会通过index.php?class=className&badge=badgeNameindex.php?class=classNameindex.php?badge=badgeName 或只是简单的旧index.php 被引导到我的页面

这段代码运行良好

if ($_GET["badge"] && $_GET["class"]) {
echo 'Badge and Class'; 
} elseif ($_GET["badge"] && !$_GET["class"]) {
echo 'Badge only';   
} elseif (!$_GET["badge"] && $_GET["class"]) {
echo 'Class only';  
} else {
echo 'No variables';    
} 

但我试图用 switch 语句进行简化,除默认情况外,一切正常:

switch ($_GET) {
    case $_GET["badge"] && $_GET["class"]:
        echo 'Badge and Class';
        break;
    case $_GET["badge"] && !$_GET["class"]:
        echo 'Badge Only';
        break;
    case !$_GET["badge"] && $_GET["class"]:
        echo 'Class only';
        break;
    default:
        echo "No badge or class";
}

任何帮助表示赞赏。

【问题讨论】:

  • switch 语句不能这样工作。
  • @Outsider 它的作品,只是他需要一些更正!

标签: php switch-statement


【解决方案1】:

你可以试试这样的:

switch (true) {
    case ($i ==0):
        echo '$i ==0';
        break;
    case ($i < 1):
        echo '$i < 1';
        break;
    case ($i > 1):
        echo '$i > 1';
        break;
}

对于您的情况:

switch (true) {
    case ($_GET["badge"] && $_GET["class"]):
        echo 'Badge and Class';
        break;
    case ($_GET["badge"] && !$_GET["class"]):
        echo 'Badge Only';
        break;
    case (!$_GET["badge"] && $_GET["class"]):
        echo 'Class only';
        break;
    default:
        echo "No badge or class";
}

【讨论】:

  • 这是个坏主意。请参阅下面的答案以进行编辑,我将其与当时的重大弊端进行了比较。
【解决方案2】:

答案在您提供的链接中:

您必须将开关包含在 foreach() 循环中。

$_GET 只是一个数组,因此您必须按照链接中的建议对其进行 for-each 循环

foreach ($_GET as $key => $value) {
  // Switch goes here
}

然后在这个 for-each 中你可以做 switch,你使用 $key 的值。

你将如何解决这个问题,我暂时还没有弄清楚......

[编辑] 我会坚持使用 if-elseif 版本 - 如果你只有这两个值要检查:)

【讨论】:

    【解决方案3】:

    我认为你误解了 switch() 语句。这是 if... else if... else if 的一种特殊情况,用于将单个变量与一组可能的值进行比较。您不能在 case 语句中包含条件(计算结果为布尔值的表达式)。有关示例,请参阅http://www.php.net/manual/en/control-structures.switch.php

    编辑: 我必须花一点时间来反对以下 switch 语句的滥用:

    $a=1;
    $b=2;
    switch(true) {
        case ($a==1):
            echo "first test passed";
            break;
        case ($b==2):
            echo "second test passed";
            break;
    }
    

    这会将“真”与以下表达式的每个布尔结果进行比较。两个条件都为真,第一个执行,break; 语句跳过第二个。技术上功能强大,具有极大的误导性,我会扼杀让我调试这段代码的人。绝对可恶的做法。相比之下,如果您打开像 ($a) 或 ($a -3) 这样的值,并且您的 case 语句包含像 5 和 7 或“A”和“B”这样的比较值,那么好的 IDE 会警告您有重复的案例陈述。您可以确定恰好有一个 case 语句通过了比较。将来维护您的代码的人将不必追捕您或诅咒您的名字。请不要以这种方式使用 switch() 。如果您需要这样做,请使用 if... else if... 以提高可读性。通过这种方式,很明显必须按顺序检查测试,并且执行流程将是透明的。

    【讨论】:

    • 查看我的答案并进行测试! stackoverflow.com/a/23048309/2777820,手册上说你can include表达式或代码! The switch statement is similar to a series of IF statements on the same expression. In many occasions, you may want to compare the same variable (or expression) with many different values, and execute a different piece of code depending on which value it equals to. This is exactly what the switch statement is for.
    • 在你的例子中,你犯了一个错误,你在开关上认领了它!如果你使用 if..else 如果它相同,我在我们的主要观点上看不到任何东西, switch 可以像 if 和 if..else 一样工作,如果第一个你可以删除 break 来测试所有情况,请重新修改你的逻辑,我只是​​想帮助你而已。
    • expressions that evaluate to a boolean 没有文档和示例可以证明这一点,请注意说明您的结论,我喜欢您的帖子,但它是错误的。
    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2018-11-18
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多