他の回答でコードが壊れている理由についての説明が表示されないため、ここに簡単な概要を示します。
ここでの問題は、評価の暗黙の順序をより明確にするためにブラケットを追加することで、より明白になります。
これは、「horse」という誤った結果を生成するコードの縮小バージョンです。
$t = 'T';
( $t == 'T' ) ? 'train' :
( $t == 'C' ) ? 'car' :
( $t == 'H' ) ? 'horse' : 'feet';
まず、それを展開しましょう:
( $t == 'T' ) ? 'train' : ( $t == 'C' ) ? 'car' : ( $t == 'H' ) ? 'horse' : 'feet';
次に、暗黙的な括弧が既にある場所に、明示的な括弧を追加します。
((($t == 'T') ? 'train' : ($t == 'C')) ? 'car' : ($t == 'H')) ? 'horse' : 'feet';
次に、比較を解決できます。
((true ? 'train' : false) ? 'car' : false) ? 'horse' : 'feet';
これが壊れている理由を理解し始める必要があります。最初の 3 項は次のように評価さtrue ? 'train' : 'false'
れ'train'
ます。
('train' ? 'car' : false) ? 'horse' : 'feet';
'train'
ブール値にキャストすると true になるため、結果は次のようになり'car'
ます。
'car' ? 'horse' : 'feet';
ここでも、空でない文字列は「true」であるため、結果は「horse」になります。したがって、ネストされた恐ろしい case ステートメントで初めて atrue
が出現すると、結果は残りのすべてのステートメントにカスケードされ、次の演算子の「true」ブランチの前の値が破棄されます。
解決策は、このコードを回避することです。これはあまりに巧妙すぎる試みであり、その結果、壊れて判読不能な混乱が生じます。使用する理由はまったくありません。switch
ステートメントを選択してください。それはまさにあなたがやろうとしていることのために構築されたものです。