条件に応じて処理の内容を分けたい!と思った時に、皆さんはどのような方法でコードを記述しますか?
一般的によく使われるのはif文による条件分岐ですが、ちょっとした処理のために毎回if文で条件分岐をしていては、コードが長くなって読みづらくなってしまうこともあります。
そこで今回は、条件分岐を簡潔に記述することができる三項演算子について解説をしていきたいと思います。
三項演算子とは?
三項演算子とは、3つの項目を使用して処理を行う演算子のことを指します。
基本的には、if文の省略形として利用する場合がほとんどで、「if … else」と同等の処理を行うことができます。基本構文は以下の通りです。
【基本構文】
条件式 ? 真の式 : 偽の式
三項演算子では、まず初めに値の比較条件を指定し、その後に比較結果が真である場合の式と、偽である場合の式を順に指定します。
条件式がtrueの場合は真の式、falseの場合は偽の式の処理が行われ、その結果が式全体の値として返されます。
if文に似た処理をすることから、条件演算子とも呼ばれています。
三項演算子の使い方
続いて、三項演算子の具体的な使用方法を解説していきます。
三項演算子の基本的な使い方
まずは、三項演算子の基本的な使い方について見ていきましょう。
先ほど紹介した基本構文をもとに、以下のサンプルコードで変数「$num1」と「$num2」の値を比較してみます。
【サンプルコード】
<?php
$num1 = 10;
$num2 = 20;
echo $num1 > $num2 ? 'num1はnum2より大きい' : 'num1はnum2より小さい';
?>
【実行結果】
num1はnum2より小さい
以上のような処理をもしif文で記述するとしたら、以下のようなコードになります。
【if文を使用した場合のサンプルコード】
<?php
$num1 = 10;
$num2 = 20;
if ($num2 > $num1) {
echo 'num1はnum2より小さい';
} else {
echo 'num1はnum2より大きい';
}
?>
三項演算子を使用した場合と比べて、コードが長く煩雑になってしまいました。
このように、三項演算子を使うことで本来なら数行に渡って記述しなければいけない処理を1行にまとめることができるため、三項演算子の方がコードを簡潔にできる傾向にあります。
ただし、内容によってはif文の方が可読性が高くなるケースもあるため、状況に応じて使い分けると良いでしょう。
また、三項演算子の結果は、変数に代入したり関数の返り値として使用することもできます。
【サンプルコード】
<?php
function compare($val){
return $val > 10 ? 'valは10より大きい' : 'valは10より小さい';
}
$num1 = 10;
$num2 = 20;
echo compare($num2);
echo "\n";
$result = $num1 > $num2 ? 'num1はnum2より大きい' : 'num1はnum2より小さい';
echo $result;
?>
【実行結果】
valは10より大きい
num1はnum2より小さい
三項演算子を使う場合の注意点
三項演算子は、条件式の真偽によって返される式が変わるため、型に注意して使用する必要があります。
例えば、以下のサンプルコードを実行するとエラーが発生してしまいます。
【エラーが発生するコード】
<?php
function price($val1, $val2){
return $val1 * $val2;
}
$str = 'みかん';
$num = $str == 'りんご' ? 200 : 'りんごではありません';
$price = price($num, 5);
echo "値段:{$price}円";
?>
偽の式で返される値が文字列のため、関数の実行時に乗算ができずにエラーとなっています。
上記のコードは極端な例ですが、このように型を意識せずに記述してしまうと、エラーや意図しない動作を発生させる原因になりかねません。
特に、PHPでは変数の型が動的に決定されるため、注意が必要です。
また、使い方の説明時にも触れましたが、記述内容によってはIf文よりも三項演算子の方が可読性が下がるケースがあるため、場合に合わせてIf文と使い分けるようにしましょう。
三項演算子をネストする
三項演算子では、指定する式に三項演算子を重ねて使用することもできます。
以下は、その構文の一例です。
【基本構文】
条件式1 ? 真の式1 : (条件式2 ? 真の式2 : 偽の式);
上記の例の場合、条件式1の結果がTRUEであれば真の式1が返され、FALSEであれば条件式2の結果に応じて真の式2か偽の式が返されます。
サンプルコードで実際の動きを見てみましょう。
【サンプルコード】
<?php
$num = 21;
$result = $num < 10 ? 'numは10より小さいです' :
($num%2 == 0 ? 'numは10より大きい偶数です' : 'numは10より大きい奇数です');
echo $result;
?>
【実行結果】
numは10より大きい奇数です
エルビス演算子とNull合体演算子
PHPには、PHP5.3から使えるようになったエルビス演算子と、PHP7から使えるようになったNull合体演算子というものがあります。どちらも、三項演算子をより簡略的に記述する方法の1つです。
それぞれの違いについて、詳しく見ていきましょう。
エルビス演算子とは?
エルビス演算子は、三項演算子の条件式と真の式が同じである場合に、真の式を省略して記述する形式のことを呼びます。
エルビス演算子という呼び名は厳密には正式名称ではなく、PHPの公式のドキュメントには単に三項演算子の書き方の1つとして紹介されています。
【基本構文】
条件式(真の式) ?: 偽の式;
条件式がTRUEと同等の場合、式の値もしくはTRUEを示す「1」が返され、FALSEだった場合には偽の式が返されます。
上記の式を通常の三項演算子で記述した場合、以下の例のようなコードになります。
【サンプルコード】
$result = $a ? $a : $b;
式の結果をそのまま使いたいか否かで、通常の三項演算子と使い分けることができます。
サンプルコードで実際の動きを見てみましょう。
【サンプルコード】
<?php
$str = 'TRUEです';
echo $str ?: '空文字です';
echo "\n";
$str = '';
echo $str ?: '空文字です';
echo "\n";
$str = '0';
echo $str ?: 'FALSEです';
echo "\n";
$num = 10;
echo $num ?: 'FALSEです';
echo "\n";
$num = 0;
echo $num ?: 'FALSEです';
echo "\n";
echo true ?: 'false';
?>
【実行結果】
TRUEです
空文字です
FALSEです
10
FALSEです
1
基本的に、値が代入されている場合はTRUEの扱いとなり、空の値や未定義の変数などはFALSEと判断されます。ただし、「0」に関しては数値と文字列のどちらもFALSEの扱いとなるため、サンプルコードの結果でも偽の式が返却されています。
Null合体演算子とは?
Null合体演算子は、条件式の結果がNullか否かで処理を変えたい場合に使用する演算子です。
結果がNullになる場合は右の式を返し、ならない場合は式の値をそのまま返します。
後ほど紹介する予定の三項演算子と isset関数を組み合わせる処理を、より簡単に記述できる演算子でもあります。
基本構文は次の通りです。
【基本構文】
条件式 ?? Nullの場合の式
Null合体演算子を使用した場合の動きを、以下のサンプルコードで見てみましょう。
【サンプルコード】
<?php
echo $num ?? '値が存在しません';
echo "\n";
$num = null;
echo $num ?? '値が存在しません';
echo "\n";
$num = 0;
echo $num ?? '値が存在しません';
echo "\n";
$num = '0';
echo $num ?? '値が存在しません';
?>
【実行結果】
値が存在しません
値が存在しません
0
0
変数が未定義の場合かNullの場合には右の式が返され、それ以外では条件式の値が返されています。
エルビス演算子における未定義変数のFALSE判定は、厳密には「Notice: Undefined variable」 が発生した上でnullとして評価された結果となりますが、Null合体演算子の場合はNoticeは発生しません。
一方で、エルビス演算子の場合にはFALSE判定となった「0」の値は、NullとはならないためNull合体演算子ではそのまま式の値が表示されています。
三項演算子とisset関数を組み合わせる
先ほど紹介したNull合体演算子の判定方法を別の書き方で実装する場合、isset関数を使用することで実装できます。
isset関数は、変数にNull以外の値が設定されているか否かを判断し、その結果をbool値で返してくれるため、三項演算子の条件式として使用することで、Null合体演算子と同じように処理を分けることができます。
以下のサンプルコードで、実際の動きを見てみましょう。
【サンプルコード】
<?php
echo isset($value) ? '値が設定されています' : '未定義、もしくはNullです';
echo "\n";
$value = null;
echo isset($value) ? '値が設定されています' : '未定義、もしくはNullです';
echo "\n";
$value = 0;
echo isset($value) ? '値が設定されています' : '未定義、もしくはNullです';
?>
【実行結果】
未定義、もしくはNullです
未定義、もしくはNullです
値が設定されています
値の判定基準については、Null合体演算子と同じ基準で判断されています。
こちらの方法を使う場合はNullでないケースの式を条件式と別に指定することができるので、エルビス演算子の時と同様に式の結果をそのまま使いたいか否かで使い分けるといいでしょう。
三項演算子を使用した場合の処理速度はどうなる?
簡単な内容であればif文よりもコードを簡潔に記述することのできる三項演算子ですが、速度面でより高速に処理できるのはどちらなのでしょうか?
プログラムを書く際には、コードの可読性や管理のしやすさと同時に、実際にコードが実行される際のパフォーマンスについても考えなくてはなりませんね。
そこで今回は、同じ処理を1万回繰り返す中で、if文による比較と三項演算子による比較のどちらがより速くループを終えられるかを検証してみました。
以下がそのサンプルコードです。
【if文を使用した場合のサンプルコード】
<?php
$startTime = microtime(true);
for($i=1;$i<=10000;$i++){
$num = rand(1,10) % 2;
if($num == 0){
echo '偶';
}else{
echo '奇';
}
}
echo "\n";
$endTime = microtime(true) - $startTime;
echo "{$endTime} 秒";
?>
【三項演算子を使用した場合のサンプルコード】
<?php
$startTime = microtime(true);
for($i=1;$i<=10000;$i++){
$num = rand(1,10) % 2;
echo $num == 0 ? '偶' : '奇';
}
echo "\n";
$endTime = microtime(true) - $startTime;
echo "{$endTime} 秒";
?>
【両者の実行結果】
・If文
1回目:0.059765815734863 秒
2回目:0.059875965118408 秒
3回目:0.080043077468872 秒
4回目:0.079512119293213 秒
5回目:0.079854965209961 秒
・三項演算子
1回目:0.079958915710449 秒
2回目:0.060020923614502 秒
3回目:0.079945087432861 秒
4回目:0.099861860275269 秒
5回目:0.079980134963989 秒
ループごとに1~10の乱数を作成し、偶数か奇数を判定する処理を繰り返してみました。
実行結果としては、劇的に速度が変わるほどではなかったものの、三項演算子の方がわずかに処理が遅くなる傾向にあります。
パフォーマンスの違いやコードの可読性を考慮したうえで、作成するプログラムや開発環境に合う方を選択すると良いでしょう。
まとめ
いかがでしたか?今回は、PHPにおける三項演算子の使い方について解説をしてきました。
if文と似通う部分があるため、どのような条件で使い分けるかを悩んでしまう人も中にはいるかもしれませんが、頭の片隅に入れておくだけでも役立つ知識となりますので、ぜひ覚えてみてくださいね!
PHPの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、PHPに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。