【问题标题】:Variable has unexpected value变量具有意外值
【发布时间】:2011-06-14 04:00:03
【问题描述】:

我遇到了这个问题。不知道是我太累了,还是有什么东西不行。

我的代码是:

$sX = ($nr == 1 or $nr == 4 or $nr == 7 ? "0" : ($nr == 2 or $nr == 5 or $nr == 8 ? "200" : "400"));
$sY = ($nr == 1 or $nr == 2 or $nr == 3 ? "0" : ($nr == 4 or $nr == 5 or $nr == 6 ? "200" : "400"));

$nr[1..9] 范围内的整数(它在循环中)。就在这条语句的下一行,我输出了这两个变量。然后它们都是"1"null。为什么?我只是看不到它:(

谢谢

弗洛

【问题讨论】:

    标签: php


    【解决方案1】:

    这是因为三元运算符的运算符优先级高于逻辑or。在所有 x or y or z 部分周围添加括号。换句话说,你不妨把这个表达式写成:

    $sX = ($nr == 1 or $nr == 4 or ($nr == 7 ? "0" : ($nr == 2 or $nr == 5 or ($nr == 8 ? "200" : "400"))));
    

    第二个也是这样。

    参考:http://php.net/language.operators.precedence

    【讨论】:

    • 更好的是,停止使用三元运算符来处理复杂的逻辑,否则你最终会得到完全不可读的东西。
    【解决方案2】:

    正如 SimpleCoder 所说,直接的答案是:你需要修复你的运算符优先级。

    这可以通过使用|| 而不是or 来完成:

    $sX = ($nr == 1 || $nr == 4 || $nr == 7 ? "0" :
      ($nr == 2 || $nr == 5 || $nr == 8 ? "200" : "400"));
    

    或括号(恕我直言更好,因为它是万无一失的):

    $sX = (($nr == 1 or $nr == 4 or $nr == 7) ? "0" :
      (($nr == 2 or $nr == 5 or $nr == 8) ? "200" : "400"));
    

    或者,也许更好,重写代码以使其更简单:

    switch($nr % 3) {
        case 1:
            $sX = "0";
            break;
        case 2:
            $sX = "200";
            break;
        default:
            $sX = "400";
    }
    

    【讨论】:

      【解决方案3】:

      这可能是一个较短的示例,应该可以解决您的问题:

      $sX = ($nr-1)%3 * 200;
      $sY = floor(($nr-1)/3) * 200;
      

      【讨论】:

        【解决方案4】:

        我想你想尝试的是:

        $sX = (($nr == 1 or $nr == 4 or $nr == 7) ? "0" : (($nr == 2 or $nr == 5 or $nr == 8) ? "200" : "400"));
        

        希望对您有所帮助。

        还可以尝试使用var_dump($sX) 来查看正在计算的确切内容。

        【讨论】:

          【解决方案5】:

          只需使用|| 而不是or。它有一个更明显的precedence,并且会做你想做的事。否则,请使用括号来准确指定您期望的内容。

          话虽这么说,这个语句很难读,你应该把它分解成 if/else 块。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-13
            • 1970-01-01
            • 1970-01-01
            • 2021-10-17
            • 2013-11-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多