【PHP】三項演算子 – 条件による値の分岐
ソースコードは読みやすく、簡潔に記述することが大切です。
分岐が多いif文などは読みづらくなる傾向にありますが、1部のif文は三項演算子と呼ばれる演算子で簡潔にすることができます。
ここでは三項演算子について解説します。
検証環境
三項演算子
三項演算子は広義では3つのオペランドを使う演算子という意味ですが、プログラミングにおいては条件値に応じた値を返す演算子という意味です。
代入演算子と合わせて使うことが多くあります。
基本構文
条件値 ? 値(真の場合) : 値(偽の場合)
条件値
は最終的に真偽値となれば良いので、比較演算子や論理演算子を使った条件式で記述できます。
また、値
の部分も最終的に値になれば良いので、変数や式の利用が可能です。
三項演算子は条件値が真(true
)の場合にコロン(:
)の左側の値となり、偽(false
)の場合は右側の値とみなす演算を行います。。
サンプル
<?php
$permission = 1;
___ih_hl_start
$type = $permission == 1 ? 'MEMBER' : 'GUEST';
___ih_hl_end
echo $type;
?>
$ php sample1.php
MEMBER
5行目の$permission == 1 ? 'MEMBER' : 'GUEST'
が三項演算子を使った処理です。
$permission == 1
はtrue
のため、演算の結果は'MEMBER'
になります。
その値を$type
に代入しており、実行結果からも演算結果が'MEMBER'
であることが分かります。
if文と三項演算子
三項演算子で実現できる処理はif文でも可能です。
例えば、sample1.phpをif文で書き換えると次のようになります。
<?php
$permission = 1;
___ih_hl_start
$type = '';
if( $permission == 1 ) {
$type = 'MEMBER';
} else {
$type = 'GUEST';
}
___ih_hl_end
echo $type;
?>
$ php sample2.php
MEMBER
5〜11行目のif文で代わりの処理を行っていますが、コード量が増えています。
そのためこのケースでは三項演算子の方が適していると言えます。
しかし、3つ以上に分岐する場合は、if文の方が簡潔です。
先ずは3つ以上に分岐する三項演算子を見てみましょう。
<?php
$permission = 2;
___ih_hl_start
$type = $permission == 1 ? 'MEMBER' : ( $permission == 2 ? 'ADMIN' : 'GUEST' ) ;
___ih_hl_end
echo $type;
?>
$ php sample3.php
ADMIN
5行目で三項演算子の構造の中に三項演算子を使っています。
このコードは$permission
の値が1
の場合は'MEMBER'
、2
の場合は'ADMIN'
、それ以外の場合は'GUEST'
となります。
読みづらく感じる方が多いコードかと思います。
if文の場合は次のようになります。
<?php
$permission = 2;
$type = '';
___ih_hl_start
if( $permission == 1 ) {
$type = 'MEMBER';
} else if( $permission == 2 ) {
$type = 'ADMIN';
} else {
$type = 'GUEST';
}
___ih_hl_end
echo $type;
?>
$ php sample4.php
ADMIN
こちらのコードの方が読みやすい方が多いのではないでしょうか。
また、このケースでは更にswitch文が適している可能性もあります。
このように処理によって得意不得意があるので、処理に合わせて使い分けましょう。
演習問題
年齢から成年であるかを出力するプログラムを作成してください。
なお、下記条件を満たすものとします。
- 年齢はコマンドライン引数で与える
- 成年判定は三項演算子を使用する
$ php practice.php 23
23歳は成年です。
任意の値が自然数であるかを出力するプログラムを作成してください。
なお、下記条件を満たすものとします。
- 任意の値はコマンドライン引数で与える
- 三項演算子を使用する
- 自然数は0より大きい整数とする
$ php practice.php 8
8は自然数です。
$ php practice.php -11
-11は自然数ではありません。
$ php practice.php 123.456
123.456は自然数ではありません。