- 更新日: 2017年02月27日
- 公開日: 2015年12月08日
ゼロから始めるPHP講座Vol09 if文を使った条件分岐の方法
ゼロから始めるPHP講座if文を使った条件分岐の方法
if文とは
if文は条件によって処理内容を変更することができ、状況に応じた複雑な処理を行うことができます。
<pre>
<?php
$score = mt_rand(0, 100); //0以上100以下の数値をランダムで返す
if ($score >= 80) {
print 'ヽ( ゚∀゚)ノキタ━!!';
} else if ($score <= 30) {
print '(´・ω・<code>)ショボーン';
} else {
print 'ヽ(´ー`)ノマターリ';
}
?>
</pre>
if文を使った条件分岐により、1行のみランダムで表示される仕組みとなっています。
if文の書き方
以下のような書式で条件分岐を行います。
このように書くことで、条件に一致したかどうかで処理内容を振り分けることができます。
if文において「elseif」や「else」は省略可能で、「if」のみのプログラムや、「ifとelse」のプログラムを作成することも可能です。
次にそれぞれ例を示します。
<?php
$rand = mt_rand(0, 100);
if ($rand >= 60) {
print '合格!!';
}
?>
上記は「if」のみを利用しており、変数randが60以上の場合は合格と表示されますが、60より小さい場合は何も表示されません。
<?php
$rand = mt_rand(1, 10);
if ($rand >= 6) {
print '当たり';
} else {
print '外れ';
}
?>
上記は「ifとelse」を利用しており、110のランダムな数字を取得し、6以上の場合は当たりと表示し、それ以外(今回の場合は6未満)は外れと表示します。
if文の条件
if文は条件により処理を変えることができますが、その条件は「データ型」の講義で説明した論理型(boolean)のtruefalse判定
通常、比較演算子を用い、比較した結果一致する場合はtrue、一致しなかった場合はfalseとなることを利用します。
先ほど作成したif.phpに以下3行を追加し、trueの条件になったif文が表示されていることを確認しましょう。
<pre>
<?php
$score = mt_rand(0, 100); //0以上100以下の数値をランダムで返す
print $score . "\n";
var_dump($score >= 80); // ヽ( ゚∀゚)ノキタ━!!
var_dump($score <= 30); // (´・ω・</code>)ショボーン
if ($score >= 80) {
print 'ヽ( ゚∀゚)ノキタ━!!';
} else if ($score <= 30) {
print '(´・ω・`)ショボーン';
} else {
print 'ヽ(´ー`)ノマターリ';
}
?>
</pre>
以前紹介したように、比較演算子には「===」(等しい)、「!==」(等しくない)、「>=」(以上)、「<」(未満)など、様々な比較の例がありますが、どれも比較した結果は、true又はfalseとなります。
「==」と「===」の違い
どちらも左辺と右辺が等しいか比較しますが、この2つはデータ型を比較するかしないかとなります。
型と値を比較値のみで型を比較をしない※厳密には異なり、詳細は「補足」を参照
お手本通り、プログラムを書いて確認してみましょう。ファイル名:comparison.php
<pre>
<?php
$int = 123;
$str = '123';
//$str = '123abc123'; //補足用
if ($int == $str) {
print '$int == $str is true' . "\n";
} else {
print '$int == $str is false' . "\n";
}
if ($int === $str) {
print '$int === $str is true' . "\n";
} else {
print '$int === $str is false' . "\n";
}
?>
</pre>
数値型の123と文字列型の123を比較した場合、型(箱の形)まで比較を行う「===」はfalse、行わない「==」はtrueとなります。
どちらを使うべきかですが、基本的には「===」を使うべき
型の比較を行わない「==」はバグの原因になりやすいなど理由は様々ありますが、ひとまず本ブログでは変数の型を意識してもらう意味も含めて、「===」を使ってプログラムを書くようにしましょう。
補足.「==」について
「==」は型の比較はしないと説明致しましたが、厳密には「型を片方に合わせるよう変換した後に比較する」が正しくなります。
例えば文字列型と数値型を「==」で比較した場合は、文字列型を数値型に自動で変換した後に、比較を行います。
この型の変換というのはPHPで定義されている一定の法則で行われているのですが、一部困った法則になっており、バグの原因となることがあります。
下記のようにcomparison.phpの補足用と書かれている行のコメントを外し、1つ上の行をコメントアウトするよう変更し、ブラウザで結果を確認してみましょう。
<pre>
<?php
$int = 123;
//$str = '123';
$str = '123abc123'; //補足用
if ($int == $str) {
print '$int == $str is true' . "\n";
} else {
print '$int == $str is false' . "\n";
}
if ($int === $str) {
print '$int === $str is true' . "\n";
} else {
print '$int === $str is false' . "\n";
}
?>
</pre>
文字列から数値型への型変換を行った場合、「最初の数値から数値以外の文字が出るまで」を数値として見なし、それ以降は全て無視されます。
このため、「‘123abc123’==123」はtrueとなります。
型を自動で変換して比較してくれるのは便利なように思えますが、予期せぬ動作を起こしてしまう可能性があります。
このため、より厳密にプログラムを書くことが、遠回りなようで一番の近道となることが多くあります。
if文と論理演算子
if文の条件に論理演算子を利用することで、より複雑な条件を指定することができます。
<pre>
<?php
$score1 = mt_rand(0, 100);
$score2 = mt_rand(0, 100);
$sum = $score1 + $score2;
print 'score1: ' . $score1 . "\n";
print 'score2: ' . $score2 . "\n";
print 'sum: ' . $sum . "\n";
// 合計が160以上またはscore1かscore2が100
if ($sum >= 160 || $score1 === 100 || $score2 === 100) {
print '特待生' . "\n";
// 合計が120以上かつscore1とscore2が40以上
} else if ($sum >= 120 && $score1 >= 40 && $score2 >= 40) {
print '合格' . "\n";
// 合計が110以上
} else if ($sum >= 110) {
print '補欠合格' . "\n";
// 条件外
} else {
print '不合格' . "\n";
}
?>
</pre>
0100のランダムな数値score1とscore2とこの合計値sumを取得した後、if文の中で論理演算子「&&」や「||」を利用し、複数の条件を指定しています。
「&&||
if文は論理演算子を組み合わせると条件が複雑になり、実際に自分でプログラムを書くのが難しく感じるかもしれません。
この場合はまずコメント部分のように日本語(文章)でif文の条件を整理することをお薦めします。
if文の使用例
if文はHTMLではできない、条件によって表示する内容を変えるという動的なページ作成に必要となります。
<?php
$rand = mt_rand(1, 10); // 110の値をランダムに取得
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ifの使用例</title>
<style type="text/css">
.em_red {
color: #FF0000;
}
</style>
</head>
<body>
<h1>抽選システム</h1>
<p>値は:<?php print $rand; ?></p>
<?php if ($rand <= 3) { ?>
<h2 class="em_red">当たり!!</h2>
<?php } else { ?>
<h2>残念でした・・また引いてね</h2>
<?php } ?>
</body>
</html>
SNSなどによくあるユーザ認証の際、認証に成功したらトップページ、失敗したらエラーページを表示というのは、if文を用いて出し分けを行っています。
課題
サイコロ(16)を振り、「出た数字」と「偶数か奇数か」の2つの情報を表示してください。
NEXTLESSON配列とは配列とは
PREVLESSON演算子の種類演算子の種類
- この記事を書いた人
- CodeCampus編集部