У меня эта проблема. Я не знаю, слишком ли устал или что-то не работает.
Мой код:
$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.