0

我正在处理的投资组合网站的标题中有一个小的 switch 语句,它控制哪些链接显示在哪个页面上。$id 的值来自 GET 变量,即 - '?id=index'。

    switch($id) {
    case "index":
        //Show links to content
    case !"index":
        //Show link to index
    case !"about":
        //show link to about page
}

问题是 NOT 运算符在最后两种情况下不起作用。我希望当用户不在索引页面上时显示索引的链接,以及关于页面的链接。目前,所有链接都显示在索引页面上(当 $id == "index 时),并且 NONE 显示在任何其他页面上。

为什么会这样?

4

7 回答 7

5

之所以如此,是因为它应该如此。

switch使用==运算符进行比较。所以在第二种情况下,你实际上是在测试是否

$id == (!"index")

这将始终评估为,false因为任何字符串都是true,而不是真实的false

这意味着,在您的情况下,最好使用ifand else

于 2012-11-14T12:44:36.073 回答
0

抱歉,但是您尝试做的只是switch/case构造的无效语法。

最接近您正在寻找的内容是使用该default选项。这就像一个最终case选项,它处理没有被前面的任何cases 捕获的所有值。

switch($id) {
    case "index":
        //Show links to content
    case "about":
        //Show link to about page
    default:
        //show link to default page.
}

另外 - 不要忘记break;每个块的末尾case,否则它会掉到下一个,这可能会导致一些意想不到的错误。

于 2012-11-14T12:46:43.650 回答
0

!"index"可能会评估为false(但我对它没有导致语法错误感到惊讶)并且您实际上将拥有以下语句:

switch($id){
    case "index": //...
    case false: // ...
    case false: // ...
}

当你想使用switch时,你需要这样做:

switch($id){
    case "index": // ...
    case "about": // ...
    default: 
        // Additional statements here, note that $id != "index" is already covered 
        // by not entering into case "index"
}
于 2012-11-14T12:47:19.663 回答
0

switch case 不接受复杂的表达式。不!运算符是逻辑运算符。它适用于这样的表达式。

!$x; // true if $x = false

或作为比较运算符

 $a != $b; // Not equal
 // or 
 $a !== $b // not identical

从手册。

switch语句的 case 表达式可以是计算结果为简单类型的任何表达式,即整数或浮点数和字符串。数组或对象不能在此处使用,除非它们被取消引用为简单类型。

于 2012-11-14T12:48:18.413 回答
0

您的代码所做的是将 $id 与三个值进行比较:“index”、!“index”(无论它是什么意思)和 !“about”。

我不确定你的方法。您应该尝试 if/else 或三元运算符。

希望它有所帮助。

于 2012-11-14T12:49:51.703 回答
0

Switch 不提供自定义运算符。

 switch ( $id ) {
     case 'index':
          // $id == 'index'

          break;

     case 'about':
          // $id == 'about'

          break;

     case 'help':
     case 'info':
           // $id == 'info' or $id == 'help'

           break;

     default:
          // all other cases
}
于 2012-11-14T12:53:36.780 回答
0

当然,您可以通过以下方式解决此问题:

switch($id){
    case ($id != 'index'):
        echo 'this is not index';
        break;
    case 'index':
        echo 'this is index';
        break;
    case 'foo':
        echo 'this is foo!';
        break;
    default:
        break;
}

然而,这个例子是有缺陷的,因为第一个 case 语句只会捕获任何不是 'index' 的东西,因此你不应该使用 case 'foo' 或 default 语句

于 2013-10-22T09:39:42.523 回答