ITHACK
~ みんなのIT部門 ~

【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より大きい整数とする
$ php practice.php 8
8は自然数です。
$ php practice.php -11
-11は自然数ではありません。
$ php practice.php 123.456
123.456は自然数ではありません。

まとめ

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