あなたは、PHPで条件文を学ぶときにでてきた || を見て「ちょびひげ?」意味不明!となっていませんか?
|| は or とほぼ同じもので、条件文と条件文をつなげて「または」を意味する論理演算子です。
プログラム全体で用いられる条件文は一つとは限りません。二つ以上の条件文が「かつ」「または」などの合わせ技で使われる場合が多く、条件の組合せ方でプログラムの構成が変わってきます。複数の条件文を扱う場合には、正しく思った通りの条件でプログラミングできているかが、わからなくなりことがあります。
ここでは、あなたに「私にも使えた!」と言ってもらえるよう、例題をもとに条件文を複数使うときに便利な論理演算子 || の意味と、使い方の基礎をご案内します。
それでは、始めましょう。
まず、今回の例題の設定をお伝えします。あなたは婚活中(設定:年齢30歳女性)で、婚活サイトやマッチングアプリなどで、候補の人を抽出したいと思っています。ですが、つい「容姿」に引きずられ大事な「条件」を後回しにしてしまうという、いままでの苦い経験があります。
また、一つの簡単な条件で検索をしたのでは、どのサイトやアプリでも簡単に優先順位が決まり、競争も厳しくなってしまいます。そこで、今回は、しっかり条件を整理した上で、結婚相手の候補を選ぶため、PHPを使ってプログラミングしようとしている所です。
それでは5人の候補から、必要な条件を整理して、あなたに合った、掘り出し物の候補を見つけるプログラムを組んでみましょう。
目次
5人のデータを格納しよう
まず、結婚相手に必要な条件を5人の候補に割り当てます。「年齢」「年収」「出身大学」「職業」「身長」「体重」「趣味」・・・。条件で数字や文字にできるものは複数あります。最初にこれだけと思っていても、人数も条件も追加が必要になってきますね。
目で見てチェックしていては、そういった追加条件が発生した場合、また一から全体を見直さなければいけません。今回の例題では5人を想定しますが、実際には100人、200人・・・(サイトによっては数万人!)の中から複数の条件をもとに抽出しようとしたら、それだけで大変なことになってしまいますね。
それでは、必要な条件を整理して、データを格納しましょう。データの格納の仕方については、PHP 配列(array)をご参照ください。
最初の条件は5つ「年齢」「年収」「出身大学ランク」「職業」「趣味」です。プログラムをきちんと作れば、人数や条件の追加はそれほど難しくありませんよ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
$man[0]=[ 'Name' => "田中", 'Age' => 25, 'Income' => 400, 'Univ' => "A", 'Job' => "公務員", 'Hobby' => "サイクリング", ]; $man[1]=[ 'Name' => "小林", 'Age' => 40, 'Income' => 1200, 'Univ' => "A", 'Job' => "医者", 'Hobby' => "音楽鑑賞", ]; $man[2]=[ 'Name' => "高橋", 'Age' => 30, 'Income' => 500, 'Univ' => "B", 'Job' => "会社員", 'Hobby' => "将棋", ]; $man[3]=[ 'Name' => "佐藤", 'Age' => 35, 'Income' => 600, 'Univ' => "B", 'Job' => "会社員", 'Hobby' => "サッカー", ]; $man[4]=[ 'Name' => "近藤", 'Age' => 32, 'Income' => 1000, 'Univ' => "B", 'Job' => "自営", 'Hobby' => "映画", ]; |
それぞれのデータが正しく格納されていることを確認しましょう。
1 2 3 4 |
for($i=0;$i<=4;$i++){ echo $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//for文の閉じカッコ |
大丈夫そうです。
条件文 if を使ってみよう(条件がAだけの場合)
あなたの年齢は30歳(設定上)。性格的に姉さん女房はとても無理。まずは、自分よりも年下の人を除外します if 文を使って30歳以上の人だけ第一関門突破とします。
1 2 3 4 5 6 7 8 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']>=30){ echo $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年齢チェック) }//for文の閉じカッコ |
として、30歳以上の人であれば、名前と併せて他の条件も出力して確認します。
田中さんが、消えてしまいました。姉さん女房には、なれないのです。田中君ごめん。
条件文 if を使ってみよう(AかつBの場合)
次に年収をチェック。600万円以上の条件を入れてみましょう。
1 2 3 4 5 6 7 8 9 10 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']>=30){ if($man[$i]['Income']>=600){ echo $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年収チェック) }//if文の閉じカッコ(年齢チェック) }//for文の閉じカッコ |
ここで、if 文の中にまた if 文が入ってます。これは、最初の if 文「年齢30歳以上」の4人だけ、年収600万円のチェックを受ける入れ子構造になっています。
このプログラム構成の場合、ふたつの条件をAとBとした場合、「AかつB」となっています。条件文が、入れ子構造になっている場合は、条件に優先順位(Aの条件をクリアしたときだけ、Bの条件をチェックする)がついていることに注意しましょう。
そして、優先順位はありますが、年齢30歳以上で、かつ、年収600万円以上の下記3人が残ることになります。
今度は高橋さんが、消えました。ごめん、高橋さん、将棋は好きだけど年収の条件は譲れないのです。
条件文 if を使ってみよう(AまたはBの場合)
ここまでで、5人の候補のうち2人が脱落しました。誰がどの条件に足りないかを確認してみましょう。if 文で年齢が足りない人と年収が足りない人と別々に(並列に)ならべてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']<30){ echo "年齢で脱落" . "-" . $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年齢チェック) if($man[$i]['Income']<600){ echo "年収で脱落" . "-" . $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年収チェック) }//for文の閉じカッコ |
田中さんは、年収でも条件に足りませんでした。若くて、公務員だから仕方がないか。あと5歳、若ければ・・・。ここで、条件文で if 文を並列にしているので、最初の条件の真偽に関わらず、2番目の条件を5人全てチェックしていることも確認しましょう。
条件文「AかつB」で、「and , &&」を使う場合
if 文で入れ子構造にした「AかつB」のプログラムを論理演算子「and , &&」を使って組んでみましょう。まずは「AかつB」=「A and B」です。
1 2 3 4 5 6 7 8 9 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']>=30 and $man[$i]['Income']>=600){ echo "年齢・年収とも合格!" . "-" . $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年齢と年収チェック) }//for文の閉じカッコ |
if 文だけでプログラミングしたものと同じになります。分かりやすくするため、コメントも入れておきました。次に、「AかつB」=「A && B」
1 2 3 4 5 6 7 8 9 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']>=30 && $man[$i]['Income']>=600){ echo "年齢・年収とも合格!" . "-" . $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年齢と年収チェック) }//for文の閉じカッコ |
条件文が複数あっても、処理が一つだけであれば、論理演算子を使ったほうがプログラムが分かりやすく組める場合がありますね。
条件文「AまたはB」を、「or , ||」を使う場合
まず、「年齢または年収」を「年齢 or 年収」で組んで、コメントも出力しましょう。
1 2 3 4 5 6 7 8 9 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']>=30 or $man[$i]['Income']>=600){ echo "年齢または年収の少なくとも1つは合格!" . "-" . $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年齢と年収チェック) }//for文の閉じカッコ |
とにかく田中君は、どちらの条件もクリアしていません。
次に、「年齢または年収」を「年齢 || 年収」で組んで、コメントも出力しましょう。ここで、|| の入力は、「半角 shift + ¥」です。全角で入力すると似たような||が出てきますが、プログラムでエラーが出ますので注意しましょう。
1 2 3 4 5 6 7 8 9 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']>=30 || $man[$i]['Income']>=600){ echo "年齢または年収の少なくとも1つは合格!" . "-" . $man[$i]['Name'] . "-" . $man[$i]['Age'] . "-" . $man[$i]['Income'] . "-" . $man[$i]['Job'] . "-" . $man[$i]['Hobby'] . PHP_EOL; }//if文の閉じカッコ(年齢と年収チェック) }//for文の閉じカッコ |
候補の条件として、年齢30歳以上、年収600万円以上の両方をクリアしたのは、小林さん、佐藤さん、近藤さんでした。3人同時にアプローチできません。なにか他に条件を考えたくなりました。
条件をいろいろ整理していると、必要な条件以外に、絶対NGという条件が出てきました。NG条件、あなたの場合は40歳以上(歳が離れすぎてしまう)、喫煙、離婚歴のうち、どれかに該当する人はNGです。
そこで、プロフィールから、そのNG条件が分かった人には、Other1として条件に加えることにしました。ここでは、小林さんに「喫煙」、近藤さんに「離婚歴」があります。「喫煙」「離婚歴」がない、他の人にはOther1に空の ”” を格納しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
$man[0]=[ 'Name' => "田中", 'Age' => 25, 'Income' => 400, 'Univ' => "A", 'Job' => "公務員", 'Hobby' => "サイクリング", 'Other1' => "" ]; $man[1]=[ 'Name' => "小林", 'Age' => 40, 'Income' => 1200, 'Univ' => "A", 'Job' => "医者", 'Hobby' => "音楽鑑賞", 'Other1' => "喫煙" ]; $man[2]=[ 'Name' => "高橋", 'Age' => 30, 'Income' => 500, 'Univ' => "B", 'Job' => "会社員", 'Hobby' => "将棋", 'Other1' => "" ]; $man[3]=[ 'Name' => "佐藤", 'Age' => 35, 'Income' => 600, 'Univ' => "B", 'Job' => "会社員", 'Hobby' => "サッカー", 'Other1' => "" ]; $man[4]=[ 'Name' => "近藤", 'Age' => 32, 'Income' => 1000, 'Univ' => "B", 'Job' => "自営", 'Hobby' => "映画", 'Other1' => "離婚歴" ]; |
それぞれの人に、データを追記しました。条件を整理しましょう。
OK条件:年齢は30歳以上、かつ 、年収600万円以上
NG条件:年齢40歳以上、または、離婚歴、または、喫煙
if 文と論理演算子&&(意味:かつ)、||(意味:または)使って動作を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
for($i=0;$i<=4;$i++) { if($man[$i]['Age']>=30 && $man[$i]['Income']>=600){ echo "年齢(30歳以上)・年収(600万円以上)ともに合格!" . $man[$i]['Name'] . PHP_EOL; if($man[$i]['Age']>=40 || $man[$i]['Other1']==="離婚歴" || $man[$i]['Other1']==="喫煙"){ echo "脱落 年齢(40歳以上)又は離婚歴又は喫煙" . "-" . $man[$i]['Name'] . PHP_EOL; $man[$i]['Name'] = ""; //一発、不合格条件なら名前を削除 }//一発、不合格のif文の閉じカッコ }//if文の閉じカッコ(年齢と年収チェック) }//for文の閉じカッコ |
思ったような、条件チェックが出来ていることが確認できました。このように条件文は、「かつ」、「または」の意味合いや、条件の構成によって優先順位が変わってきます。条件整理が出来たら、基本動作を確認する習慣をつけましょう。
それでは、条件から外れた人は、名前自体を消す(名前のデータに ”” 空データを格納しなおす)ことにします。
候補者選定に当たっては、今回のように〇×式もありますが、この条件に該当したら-10点など減点方式や趣味が合ってる場合+20点などの加点方式もあります。減点や加点を総合して70点以上だったら合格とするようなやり方もありますね。でも、ここでは〇×式。一発不合格(きびしい~)で選定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
for($i=0;$i<=4;$i++){ if($man[$i]['Age']>=30 && $man[$i]['Income']>=600){ if($man[$i]['Age']>=40 || $man[$i]['Other1']==="離婚歴" || $man[$i]['Other1']==="喫煙"){ $man[$i]['Name'] = ""; //一発、不合格条件なら名前を削除 }//一発、不合格のif文の閉じカッコ }//if文の閉じカッコ(年齢と年収チェック) else{ $man[$i]['Name'] = ""; //年齢30歳未満、年収600万円未満は名前を削除 } if($man[$i]['Name'] !== ""){ echo "候補の相手は" . $man[$i]['Name'] . "さんです!" . PHP_EOL; }//if文の閉じカッコ(名前が消されていない人) }//for文の閉じカッコ |
もとの格納した名前が残っている人(名前が空でない→名前 !== ””)だけ、候補者として出力します。
やりました!候補者は佐藤さんです!さっそくアプローチ開始です。
PHPでの || の意味と便利さ
今回、候補相手を絞った条件を改めて確認します。
OK条件:年齢は30歳以上、年収600万円以上
NG条件:年齢40歳以上、離婚歴、喫煙
それほど、多い条件ではありませんね。それでも、プログラムの構成は、複雑化しつつあります。条件文を if 文だけで構成すると、「AかつB」なら深く、「A又はB」なら広くなってしまい、プログラムの構造自体が分かり難くなります。
また、条件の追加や削除があった場合も if 文だけだと、手間がかかってしまいます。そこで、論理演算子、意味は「かつ:and , &&」「または:or , ||」を使うことで分かりやすく、プログラミングの条件変更にも柔軟に対応することができます。
注意点として、and と &&、or と || はほぼ同じ挙動を示しますが、論理演算子の種類で優先順位が異なります。複数の論理演算子を混在させる場合には、目的に沿った条件チェックがなされているかを、こまめに出力して確認しましょう。
さいごに
条件文が複数出てきて「AかつB」「AまたはB」「(AかつB)またはC」とかになってくると、プログラムの構造は複雑になってしまいます。
「&&:かつの意味」「||:またはの意味」を使って、視覚的に分かりやすいプログラムを組んで掘り出し物の婚活候補を秒で見つけちゃいましょう。