变量具有意外值

时间:2011-06-12 22:37:21

标签: php

我遇到了这个问题。我不知道我是不是太累了,或者是否有什么不起作用。

我的代码是:

$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。为什么?我只是看不到它:(

由于

弗洛

5 个答案:

答案 0 :(得分:8)

这是因为三元运算符的运算符优先级高于逻辑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

答案 1 :(得分:5)

直接答案就像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";
}

答案 2 :(得分:2)

只需使用||代替or。它有一个更明显的precedence,并且会做你想要的。否则使用括号来准确指定您的期望。

话虽如此,这句话是不可读的,你应该把它分解成if / else块。

答案 3 :(得分:2)

我想你想要尝试的是:

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

希望有所帮助。

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

答案 4 :(得分:2)

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

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