Переменная имеет неожиданное значение

У меня эта проблема. Я не знаю, слишком ли устал или что-то не работает.

Мой код:

$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 . Зачем? Я просто не вижу этого 🙁

благодаря

Фло

Solutions Collecting From Web of "Переменная имеет неожиданное значение"

Это связано с тем, что тернарный оператор имеет более высокий приоритет оператора, чем логический 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

Прямой ответ заключается в том, что 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.