PHP-тернарный оператор работает не так, как ожидалось

Почему эта печать 2?

echo true ? 1 : true ? 2 : 3; 

По моему мнению, он должен печатать 1.

Почему он работает не так, как ожидалось?

Related of "PHP-тернарный оператор работает не так, как ожидалось"

Потому что то, что вы написали, такое же, как:

 echo (true ? 1 : true) ? 2 : 3; 

и, как вы знаете, 1 оценивается как true .

Что вы ожидаете:

 echo (true) ? 1 : (true ? 2 : 3); 

Поэтому всегда используйте брекеты, чтобы избежать таких путаниц.

Как уже было сказано, тернарные выражения остаются ассоциативными в PHP. Это означает, что сначала будет выполнен первый слева , затем второй и так далее.

Разделите вторую тройную статью с круглыми скобками.

 echo true ? 1 : (true ? 2 : 3); 

При возникновении сомнений используйте круглые скобки.

Тернарный оператор в PHP лево-ассоциативный, в отличие от других языков, и работает не так, как ожидалось.

из документов

 Example #3 Non-obvious Ternary Behaviour <?php // on first glance, the following appears to output 'true' echo (true?'true':false?'t':'f'); // however, the actual output of the above is 't' // this is because ternary expressions are evaluated from left to right // the following is a more obvious version of the same code as above echo ((true ? 'true' : false) ? 't' : 'f'); // here, you can see that the first expression is evaluated to 'true', which // in turn evaluates to (bool)true, thus returning the true branch of the // second ternary expression. ?>