LoginSignup
16
13

More than 5 years have passed since last update.

PHPで三項演算子を二重にするとどうなるか?

Last updated at Posted at 2016-02-17

問題

問1

以下のコードの$num1, 2, 3それぞれの場合の出力結果はどうなるか?

print($num == 3 ? $num == 2 ? "2です。" : "3です。" : "1です。");

答えは、こう。

$num = 1; // 1です。
$num = 2; // 1です。
$num = 3; // 3です。

$num = 2の時だけ答えが期待値とはズレてるね。

では、次の問題。

問2

以下のコードの$num1, 2, 3それぞれの場合の出力結果はどうなるか?

print($num == 3 ? "3です。" : $num == 2 ? "2です。" : "1です。");

答えは、こう。

$num = 1; // 1です。
$num = 2; // 2です。
$num = 3; // 2です。

今度は$num = 3の時、答えがズレている。
なぜこうなったのか?PHPにおける三項演算子のネストはどうなるかを確認した。

三項演算子の詳細

PHPの公式ページより、PHPにおける三項演算子の仕様を確認したところ、

(expr1) ? (expr2) : (expr3) という式は、式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。
PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。

公式ページより引用)

とありました。簡単に言うと、左から右に評価されるということ。公式ページを読み進めていくといくつか注意点が記載されているが、その中に「三項演算子を "積み重ねて" 使用することは避けましょう。」とあった。そもそも三項演算子をネストすることは避けるべきらしい。(笑)

※まぁ、わざわざ三項演算子でネストするくらいなら、if-else文やswitch文で書けよ、ってことかな。

プログラムの解説

上記を踏まえて、二つの問いのプログラムの解説をば。
問1のプログラムは以下のコードを同じものとなる。

問1(改)
print($num == 3 ? ($num == 2 ? "2です。" : "3です。") : "1です。");

したがって$num = 3以外の時は全て "1です。" が表示される事になる。これは簡単。

続いて問2のプログラムは以下のコードと同じ。

問2(改)
 print(($num == 3 ? "3です。" : $num == 2) ? "2です。" : "1です。");

$num = 3の時、($num == 3 ? "3です。" : $num == 2)の結果は "3です。" となる。この結果をもって次の三項演算子に処理が移るので、
全体としては("3です。" ? "2です。" : "1です。")となる。ここで、"3です。"はPHPではtrueと見なされるため、"2です。"が表示される事になる。

ちなみに三項演算子を二重ではなく三重にしようとしたら、syntax errorとなったので、実行できないようだ。(そんなプログラムを書くことはおそらくないとは思うが)
自分の書き方がミスっていただけでした。すみません。

16
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13