У меня эта проблема. Я не знаю, слишком ли устал или что-то не работает.
Мой код:
$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
. Зачем? Я просто не вижу этого 🙁
благодаря
Фло
Это связано с тем, что тернарный оператор имеет более высокий приоритет оператора, чем логический 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"))));
То же самое для второго.
Прямой ответ заключается в том, что 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"; }
Это может быть более короткий пример и должен решить вашу проблему:
$sX = ($nr-1)%3 * 200; $sY = floor(($nr-1)/3) * 200;
Я думаю, что вы хотите попробовать:
$sX = (($nr == 1 or $nr == 4 or $nr == 7) ? "0" : (($nr == 2 or $nr == 5 or $nr == 8) ? "200" : "400"));
Надеюсь, это поможет.
Также попробуйте использовать var_dump($sX)
чтобы увидеть, что именно вычисляется.
Просто используйте ||
вместо or
. Он имеет более очевидный приоритет и будет делать то, что вы хотите. В противном случае используйте скобки, чтобы точно указать, что вы ожидаете.
При этом это утверждение довольно нечитаемо, и вы должны, вероятно, разбить его на блоки if / else.