我遇到了这个问题。我不知道我是不是太累了,或者是否有什么不起作用。
我的代码是:
$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
。为什么?我只是看不到它:(
由于
弗洛
答案 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"))));
第二个相同。
答案 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;