带有$ _GET变量的PHP switch语句

时间:2014-04-13 20:39:08

标签: php switch-statement

这样的页面:PHP switch case $_GET's variables and switch case $_GET's variable's values和其他人有帮助,但我不知道为什么我的交换机声明不起作用。

用户可能会被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";
}

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

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";
}

答案 1 :(得分:0)

我认为你误解了switch()语句。这是if ... else if的特殊情况,如果将单个变量与一组可能的值进行比较,则为else。您不能在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;
}

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

答案 2 :(得分:0)

答案在你给出的链接中:

  

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

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

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

然后在这个for-each里面你可以切换,你可以使用$key的值。

你将如何解决这个问题,我现在还没想到......

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