非エンジニアでも知らないとヤバイPHP Part8〜条件分岐について理解しよう〜
コラム前回はPHPの配列について説明いたしました。今回はPHPの条件分岐(if文)について説明いたします。
条件分岐とは
条件分岐とは「ある条件が満たされる(論理値でtrueだった)かどうかによって、次に実行する処理を変化させる」ことです。PHPで記述する場合はif文という記法を用います。基本的な書き方は次の様になります。
<?php
if(条件){
条件が当てはまる場合の処理
}
?>
次から詳しくみていきましょう。
条件分岐の作成方法
具体例をみていきましょう。新しいphpファイルを用意して
<?php
$a = 1;
if($a == 1){
print('aは1です。');
}
?>
と入力してみてください。入力終了後ブラウザに表示(ブラウザの表示方法はこちら)させた場合「aは1です。」と表示されるはずです。これは$a == 1の条件式が正しい(true)ため、print関数が実行されております。ここで記入しているイコール2つ(==)ですが、論理型(true、false)を返す演算子となります。
では次に
<?php
$a = 1;
if($a == 2){
print('aは2です。');
}
?>
と入力してブラウザに再度反映させてみてください。恐らく今度は表示されないと思います。これは変数aに1が代入されている状態で、$a == 2の条件式が正しくない(false)ため、print関数が実行されなかったことになります。
if文の条件に関して(true/false)
さて、ここでif文での「条件」について説明します。この条件ですが、判定は論理型(Boolean)で実行いたします(Booleanの説明はこちら)。条件を実行した結果がtrue(正しい)の場合{ }(カーリーブラケット)の中が実行されます。条件の実行結果がfalse(正しくない)の場合、{ }の中の処理は実行されません。試しに次を実行してみてください。
<?php
$a = true;
if($a){
print('trueです。');
}
?>
「trueです。」とブラウザに表示されると思います。次は
<?php
$a = false;
if($a){
print('falseです。');
}
?>
こちらはいかがでしょう。今度は表示されないかと思います。変数aにfalseが代入されているため、if文で記載している( )内の条件はfalseとなります。
では、次はどうでしょう?
<?php
$a = false;
if($a == false){
print('falseです。');
}
?>
今度は「falseです。」と表示されるかと思います。これは、変数aにfalseが格納されていますが、if文内の条件である$a == falseは正しい(true)ですね。従って、条件式内がtrueのため、{ }内のprint関数が実行されます。
では次はどうでしょうか。
<?php
if(0){
print('条件式の中は0です。');
}
?>
こちらは…実は表示されません。これは論理型(こちら)で説明しましたが、「0(integer)」は論理値ではfalseが返却されます。従って、条件もfalseが格納され、print関数が実行されなくなります。
他にも””(空の文字列)などの論理型で説明したfalseに該当する論理型が条件式に入っている場合、if文の{ }内の処理は実行されません。
条件式がfalseでの処理(! ビックリマーク・エクスクラメーションマーク)
先ほどは条件式がtrueの時の説明をいたしました。では、条件式がfalse(true「以外」)の場合でも処理をしたい場合はどのようにすればよいのでしょうか。この場合、条件式の先頭に「!(ビックリマーク・エクスクラメーションマーク)」を入力すれば処理が実行されます(半角文字で入力してください)。
PHPでの「!」は、論理演算子の「否定」を表します。具体例を見てみましょう。
<?php
$score = 1;
if(!($score == 100)){
print("変数scoreは100ではありません");
}
?>
この場合、if文の処理は実行されます。$scoreに1が代入されているため$score == 100はfalseですが、!($score == 100)とすることで($score == 100)のfalseを「!」で否定しています。つまり!($score == 100)と記載することでここはtrueになり、if文の中のprint関数が実行されます。
条件がtrue/falseでの処理(else)
これまでは「ある条件が満たされる場合(true)」だけの処理を「!」も含めて説明いたしました。では「ある条件が満たされた場合と満たされなかった場合の処理」の2パターンの分岐をする処理はどうすればよいのでしょうか。その場合「else」を用います。基本的な書き方は次の通りです。
<?php
if(条件){
条件が満たされた場合の処理
} else {
条件が満たされなかった場合の処理
}
?>
上記の通り、条件が満たされた場合の処理の後ろに else { 条件が満たされなかった場合の処理 }を追加すればOKです。具体例を見ていきましょう。
<?php
$score = 70;
if($score >= 75){
print('scoreは75以上です');
} else {
print('scoreは75未満です');
}
?>
この場合はelse後の処理が実行されます。$scoreに70が代入されており、$score >= 75はfalseとなります。ちなみに$scoreに75以上の数値(integer)を代入すれば条件式がtrueとなり、print(‘scoreは75以上です’)が実行されます。
3つ以上の条件分岐(else if(){}else{})
さて、これまでは「条件が満たされた場合の処理の実行」「条件が満たされた場合、または満たされなかった場合」のif文をご紹介してきました。
次は「条件が3つ以上あった場合(複数条件)の条件分岐」をご紹介いたします。この場合、else if(){}else{}を用います。基本的な書き方は以下の通りです。
<?php
if(条件1){
条件1が満たされる場合の処理;
} else if(条件2){
条件2が満たされる場合の処理;
} else {
条件1も条件2も満たされなかった場合の処理;
}
?>
今回は3つの条件でご紹介しましたが、else if(){}else if(){}…と繋げることで、条件をいくつでも追加していくことが可能です。では具体例を見ていきましょう。
<?php
$score = 55;
if($score >= 80){
print('優');
} else if($score >= 70){
print('良');
} else if($score >= 60){
print('可');
} else {
print('不可');
}
?>
この場合「不可」が表示されます。今回の条件は
- 「$scoreが80以上の場合は’優’を出力」
- 「$scoreが70以上の場合は’良’を出力」
- 「$scoreが60以上の場合は’可’を出力」
- 「$scoreが上記以外の場合は’不可’を出力」
の処理が「上から順番に実行」されています(プログラミングの順次処理)。今回$scoreには55が代入されているため、$score >= 80(false)、$score >= 70(false)、$score >= 60(false)が確認された後、どの条件も満たされなかった結果、最後のelse{ }内のprint関数が実行され「不可」が表示されます。上記の場合、$scoreに80以上が代入されていれば「優」が表示されます。
条件分岐と順次処理(else if(){} else {})
では、次はいかがでしょうか。
<?php
$score = 95;
if($score >= 60){
print('可');
} else if($score >= 70){
print('良');
} else if($score >= 80){
print('優');
} else {
print('不可');
}
?>
$scoreは80以上ですが「可」が表示されます。
今回期待する挙動としては「優」の表示です。この原因は、先ほど記載したプログラミングの順次処理と関係があります。今回のif文は最初の条件に$score >= 60が表示されています。
「$score = 95は$score >=60」なので最初の処理が実行されます。if文は、条件が当てはまった段階でif文の処理が実行され「後の処理は実行されません」。従って今回の条件分岐では「可」が表示されることになります(せっかく高いscoreなのに…)。
このことから、if文を含むプログラミングの処理は「順番」を考慮する必要があることがわかります。考え方としては、条件の厳しいものから順番に処理を実行し、最後に最も条件が甘い条件を実行する様なコードを書くと、期待する挙動が返ってくることになります。
複数条件(if文の入れ子・ネスト)
さて、これまでは複数の条件分岐について説明してきました。ここでは複数の条件について説明します。例えば「東京都にお住まいの、20歳以上のお客様限定の商品」があったとします。この場合「東京にお住まい」と「20歳以上」の両方(複数)の条件を満たす必要があります。この様に複数の条件がある場合、入れ子(ネスト)を用いることで表現が可能です。入れ子の書き方は、次の様になります。
<?php
if(条件1){
if(条件2){
条件1がtrueかつ、条件2もtrueの時の処理
}
}
?>
if文の中にif文が入っていますね。この様に「ある構造の内部に同じ構造が含まれている状態」のことを入れ子(ネスト)と表現します。
条件1がtrueの時に最初の{ }の中の処理に移ります。{ }の中にif(条件2){ }があるので、今度は条件2の論理値が確認されます。条件2がtrueだった場合、if(条件2){ }の中の処理が実行されます。このように書くことで、複数条件のif文を書くことが可能です。
さて、以上を踏まえて例え話に戻ります。先程の条件に当てはまる人をあらかじめ用意する必要があるので、該当する$member変数も配列で用意いたします(配列に関してはこちらを参照)。
<?php
$member = array(
'name' => '太郎',
'gender' => '男性',
'age' => 20,
'address' => '東京都',
);
if($member['address'] == '東京都'){
if($member['age'] >= 20){
print('限定商品の購入が可能です!');
}
}
?>
この様に書くことで、「東京にお住まい」と「20歳以上」の両方(複数)の条件を設定し、論理値を確認することが可能になります。上記は両方の条件を満たすため、「限定商品の購入が可能です!」と表示されます。
入れ子構造はいくらでも中に記入することが可能です。より厳しい条件を作ることも可能ですが、あまり入れ子が多くなる(ネストが深くなる)とコードが読みづらくなるため、書き方には注意が必要です。
複数条件(かつ(&&)、または(||))
if文の入れ子構造を用いて複数条件の説明をしましたが、他の書き方を行うことで同様の表現が可能です。ここでは&&と||についてご紹介いたします。
複数条件の設定方法
- &&:かつ(and条件)
- ||:または(or条件)
&&は、「◯かつ△」に該当します。厳密に言うと「&&の左側の論理値が「true」だった時に、右側の論理値を確認し、右側の論理値を返却する。左側が「false」の場合、falseを返却する。」となります。つまり、&&の左側の論理値がfalseだった場合、その時点でfalseが返却されるので、右側の論理値は確認されません。
||は、「○または△」に該当します。こちらも厳密に言うと「||の左側の論理値が「false」だった時に、右側の論理値を確認し、右側の論理値を返却する。左側の論理値が「true」の場合、trueを返却する。」となります。つまり、||の左側がtrueだった場合、その時点でtrueが返却されるため、右側の論理値は確認されません。
&&:かつ(and条件)
では実際に&&を書いてみましょう。先程の
<?php
$member = array(
'name' => '太郎',
'gender' => '男性',
'age' => 20,
'address' => '東京都',
);
if($member['address'] == '東京都' && $member['age'] >= 20){
print('限定商品の購入が可能です!');
}
?>
こう書くと「限定商品の購入が可能です!」が表示されます。ここでは&&の左側の$member[‘address’] == ‘東京都’の論理値を判断した後、&&の右側の$member[‘age’] >= 20の論理値を確認します。両方trueのため、($member[‘address’] == ‘東京都’ && $member[‘age’] >= 20)はtrueが返却されるため、print関数が実行されます。
||:または(or条件)
では次に「65歳以上、または6歳以下の方は乗車賃免除」の乗り物があったとします。この条件をPHPで記述すると、例えば次の様に表現できます。
<?php
$member = array(
'name' => '幼稚園児',
'gender' => '女性',
'age' => 5,
);
if($member['age'] >= 65 || $member['age'] <= 6 ){
print('該当の年齢の方は、乗車賃が無料です。');
}
?>
この場合「該当の年齢の方は、乗車賃が無料です。」が表示されます。ここでは最初に$member[‘age’] >= 65の論理値が判断されます。||の左側がfalseのため、続いて||の右側の$member[‘age’] <= 6の論理値が判断されます。||の右側がtrueのため、if文の中のprint関数が実行されます。
if文を1行で書く(三項演算子 ?と:)
ここまでif文のご紹介をいたしましたが、実は条件分岐処理はif文以外の記載方法もあります。三項演算子と呼ばれる書き方を用いると表現が可能です。基本的な書き方は以下の通りです。
<?php
条件 ? 条件がtrueの時の処理 : 条件がfalseの時の処理 ;
?>
条件を書き終えたら「?(半角クエスチョン)」で区切り、?の後に条件がtrueの処理を書きます。その次に「:(半角コロン)」で区切り、:の後に条件がfalseの時の処理を書きます。具体例を見ていきましょう。
<?php
$score = 62;
$score > 60 ? print('試験に合格しました') : print('残念ながら不合格です') ;
?>
この場合、「試験に合格しました」が表示されます。条件がtrueなので、? から : までの処理が実行されます。
この三項演算子、コード量が少なくなるメリットがありますが、書き方によってはコードが理解しづらくなるデメリットもあります。あとから自分が見直した時や、他の人が見てもわかりやすいコードを心がけて、適切にコードを書きましょう。
まとめ
いかがでしたでしょうか。今回はPHPの条件分岐について紹介いたしました。具体的には以下の9つをご紹介いたしました。
- 条件分岐
- 条件分岐の作成方法
- if文の条件に関して(true/false)
- 条件式がfalseでの処理(! ビックリマーク・エクスクラメーションマーク)
- 条件がtrue/falseでの処理(else)
- 3つ以上の条件分岐(else if(){}else{})
- 複数条件(if文の入れ子・ネスト)
- 複数条件(かつ(&&)、または(||))
- if文を1行で書く(三項演算子 ?と:)
今回もかなり盛りだくさんでしたね。プログラミングは1回で覚えようとせず、繰り返し使用しながら馴染ませていってください。
この条件分岐もあらゆるところで使用することが可能です。例えば「会員制のアプリケーションを起動した時に、会員登録が終わっていない方は登録ページに飛ばす」と言ったようなプログラミングにも、今回の条件分岐が扱われております。
次回は繰り返しについて説明します。こちらも今回の条件分岐と同じく、開発に必須で非常に重要な回となりますので、ぜひご覧ください。
最後に
プログラミングを独学で行うと挫折することがしばしばあります。プログラミングを学んでみたい方、短期間でプログラミングを身につけたい方は64時間で”なりたい”を叶えるプログラミングスクール「WISH」にお気軽にお問い合わせください。現在無料カウンセリングや、入会金無料キャンペーン、さらに受講料20%オフのキャンペーンを開催しております。
株式会社Knocknote代表取締役。大学卒業後不動産営業に従事した後、ITの重要性を強く感じエンジニアへ転職。ソーシャルゲーム開発、スマホアプリやPepperアプリの企画及び開発、高校でのプログラミング講師などの業務に携わる。2017年1月に創業。現在はプログラミング教育事業、システム開発事業を展開。今後は海外向けの教育事業をさらに拡大させていく事が目標。著書:『作って学べるUnity超入門』(技術評論者)