【PHP】三項演算子 – 条件によって代入する値を分岐する

ソースコードは読みやすく、理解できるよう作成することが大切です。
分岐が多いif文などは読みづらくなる傾向にあるので、1部のif文は三項演算子と呼ばれる方法を使って綺麗に書くことが望ましい場合があります。

ここでは三項演算子について解説します。

★ 内容

  • 三項演算子
  • if文と三項演算子の違い

三項演算子とは

三項演算子は広義では3つのオペランドを使う演算子という意味です。
狭義では条件式の真偽に応じた値を返す演算子という意味です。

特に代入演算子と合わせて使われることが多くあります。

基本構文

三項演算子の基本構文は次のようになります。

条件式 ? 値(真の場合) : 値(偽の場合)

条件式は最終的に真偽値となれば良いので、論理式で記述できます。
また、値は変数や数式を使うことができます。

サンプルコード

お会計でプレミア会員のみ10%OFFするサンプルコードをご覧ください。

ソースコード

<?php

// 会員ランク(プレミア = PREMIER / 一般 = GENERAL)
$member_rank = 'PREMIER';
// 割引率
$discount_rate = $member_rank == 'PREMIER' ? 0.1 : 0;
// 料金
$price = 1500;
// 合計金額
$total = $price - $price * $discount_rate;
// 出力
echo "会員の割引率は".( $discount_rate * 100 )."%です。\n";
echo "割引後の合計料金は".$total."円です。\n";

?>

実行結果

割引率は10%です。
割引後の合計料金は1350円です。

6行目の割引率を三項演算子で代入しています。
$member_rank == 'PREMIER'の真偽を判定し、真(true)のため、0.1が$discount_rateに代入されます。

なお、会員ランクの$member_rankに'GENERAL'など違う文字列を代入すると、三項演算子の条件式が偽(false)になり、割引率は0%になります。

if文と三項演算子の違い

サンプルコードをif文を使って作成した場合、次のようになります。

ソースコード

<?php

// 会員ランク(プレミア = PREMIER / 一般 = GENERAL)
$member_rank = 'PREMIER';
// 割引率
$discount_rate = null;
if( $member_rank == 'PREMIER' ) {
    $discount_rate = 0.1;
} else {
    $discount_rate = 0;
};
// 料金
$price = 1500;
// 合計金額
$total = $price - $price * $discount_rate;
// 出力
echo "割引率は".( $discount_rate * 100 )."%です。\n";
echo "割引後の合計料金は".$total."円です。\n";

?>

6行目〜11行目がif文の場合になりますが、1行だったコードが6行になりました。
三項演算子の方が行数が少なく読みやすいということが分かります。

ただし、3つ以上に分岐する場合は三項演算子よりif文が良いことが多くあります。

会員ランクに特別会員(SPECIAL)を追加した場合は次のようになります。

if文の場合

ソースコード

<?php

// 会員ランク(プレミア = PREMIER / 一般 = GENERAL / 特別会員 = SPECIAL)
$member_rank = 'SPECIAL';
// 割引率
$discount_rate = null;
if( $member_rank == 'PREMIER' ) {
    $discount_rate = 0.1;
} else if( $member_rank == 'SPECIAL' ) {
    $discount_rate = 0.2;
} else {
    $discount_rate = 0;
};
// 料金
$price = 1500;
// 合計金額
$total = $price - $price * $discount_rate;
// 出力
echo "割引率は".( $discount_rate * 100 )."%です。\n";
echo "割引後の合計料金は".$total."円です。\n";

?>

実行結果

割引率は20%です。
割引後の合計料金は1200円です。

三項演算子の場合

ソースコード

<?php

// 会員ランク(プレミア = PREMIER / 一般 = GENERAL / 特別会員 = SPECIAL)
$member_rank = 'SPECIAL';
// 割引率
$discount_rate = $member_rank == 'PREMIER' ? 0.1 : ( $member_rank == 'SPECIAL' ? 0.2 : 0 );
// 料金
$price = 1500;
// 合計金額
$total = $price - $price * $discount_rate;
// 出力
echo "割引率は".( $discount_rate * 100 )."%です。\n";
echo "割引後の合計料金は".$total."円です。\n";

?>

実行結果

割引率は20%です。
割引後の合計料金は1200円です。

三項演算子の方が読みづらくなったように感じる方が多いかと思います。

このように処理によって得意不得意があるので、変数に代入する値を2分岐させたいときは三項演算子、3つ以上に分岐させたい時はif文として利用すると良いでしょう。
※ 補足ですがこの場合はswitch文の方が更に分かりやすくなります。

演習問題

問題1

解答例

年齢から成年であるかを出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 年齢はコマンドライン引数で与える
  • 成年判定は三項演算子を使用する

実行例

コマンドライン

php practice.php 23

実行結果

23歳は成年です。

問題2

解答例

任意の値が自然数であるかを出力するプログラムを作成してください。
なお、下記条件を満たすものとします。

  • 任意の値はコマンドライン引数で与える
  • 三項演算子を使用する
  • 自然数は0より大きい整数とする

実行例1

コマンドライン

php practice.php 8

実行結果

8は自然数です。

実行例2

コマンドライン

php practice.php -11

実行結果

-11は自然数ではありません。

実行例3

コマンドライン

php practice.php 123.456

実行結果

123.456は自然数ではありません。

まとめ

三項演算子は条件によって値を2分岐する場合に使える仕組みです。
メリットを理解して、使うことでコードを読みやすくすることができます。
分かりやすいソースコードは他の人のためだけではなく、自分が後から読み返してプログラムを修正するためにも役立ちますので覚えていきましょう。