PHPプログラミング

入門

第7章 if文

この章では、プログラミングの基本構文の1つである「if文」の扱い方を学びます。if文を使えるようになると、プログラムに判断する力を与えることができます。

目次

基本的な使い方

if文の基本的な形は、次のようになります。

図1

if文の基本的な形

()内の条件式をみて、正しい場合には{}内の処理を実行します。プログラミングでは「正しい」かの判断は、「true(正しい)」か「false(正しくない)」のどちらかとなります。

例えば、「50 == 50」という左右の値を比較する式があるとしたら、この場合は等しいので「true」となります。しかし、「40 == 50」という式の場合は、左右の値が等しくないので「false」となるでしょう。
左右の値が等しいかを判断する式の他にも、「0 < 10」のように「右の値は左の値より大きいか」と比較する式や、逆に「右の値は左の値より小さいか」を比較する式もあり、必要に応じて様々な組み合わせを使うことができます。

これらの「==」や「<」「>」などはまとめて「比較演算子」と呼びますが、そもそも「==」や「<」て何?となりますよね。まずはここから見ていきましょう。

比較演算子

比較演算子には、次のようにいくつか種類があります。

code7-1.php

<?php
$a = 5;
$b = 10;
$c = 3;

// (1) 左右の値が等しいか判定
var_dump($a == $b);    // 5 == 10 -> false

// (2) 左右の値が異なるか判定
var_dump($a != $c);    // 5 != 3 -> true

// (3) 左の値より右の値が大きい(右の値より左の値の方が小さい)か判定
var_dump($a < $b);    // 5 < 10 -> true

// (4) 左の値より右の値の方が小さい(右の値より左の値が大きい)か判定
var_dump($b > $c);    // 10 > 3 -> true

// (5) 右の値が左の値以上に大きいか判定
var_dump($b <= ($a*2));    // 10 <= 10 -> true

// (6) 左の値より右の値が等しい、または小さいか判定
var_dump(($a + $c) >= $b);    // 8 >= 10 -> false

(3)と(5)、(4)と(6)の比較演算子は似ていますが、(3)(4)は左右の値が等しいときは「false」となり、(5)(6)は等しいときも「true」となります。「より大きい・より小さい」と「以上・以下」のような違いです。

簡単な例で言うと「9より大きい」「9より小さい」だと「9」は含みませんが、「9以上」「9以下」の場合は「9」も含まれますよね。これと同じです。

(1)の「==」や(2)の「!=」は、値が整数であっても文字列であっても、とにかく等しければ「true」となります。これは一見便利そうなのですが、状況によっては「整数の◯◯」と厳密にチェックしたいときもあると思います。
もちろん、そんなときのための比較演算子がちゃんと用意されています。しかしその前に、ざっと値の「」にどんなものがあるか確認しておきましょう。

値の「型」

変数などに代入される値にはそれぞれ「型」というものがあり、その値がどういうものかによってPHPが自動的に決めてくれています。

code7-2.php

<?php
var_dump(100);    // -> 整数型(integer)
var_dump(true);    // -> 論理型(boolean)
var_dump(0.186);    // -> 浮動小数点数(float)
var_dump("Test");    // -> 文字列(string)
var_dump(null);    // -> 値のないNULL型

実行してみると以下のようになります。var_dump関数は値の型まで出力してくれるので便利ですね。

出力例:

int(100) bool(true) float(0.185) string(4) "Test" NULL 

上記の他にも、配列の「Array」、これから扱うオブジェクトの「Object」があります。

少し紛らわしくなってしまうのが数字の扱いです。
整数の「4」、文字列の「4(半角数字)」、浮動小数点数の「4.0」は全て同じ「4」ですが、型は異なるのでプログラム上では厳密に言うと等しい値ではありません。
その結果、if文などで判定する際に望んだ結果とならない原因になることがあります。

そこで活躍するのが、値の型まで確認してくれる比較演算子「===」や「!==」です。

code7-3.php

<?php
// 整数と文字列の比較。「==」は型まで確認しないので等しい判定となり「true」
var_dump(4 == '4');

// 整数と文字列の比較。「===」は型まで確認するので異なる判定となり「false」
var_dump(4 === '4');

// 整数と浮動小数点数の比較。「===」は型まで確認するので異なる判定となり「false」
var_dump(4 === 4.0);

// 整数と浮動小数点数の比較。「!=」は型まで見ないので等しい判定となり「false」
var_dump(4 != 4.0);

// 整数と浮動小数点数の比較。「!==」は型まで確認するので異なる判定となり「true」
var_dump(4 !== 4.0);

比較演算子によって、型の違いまで判定することができることをイメージできたら完璧です。

if〜else文

if文へ話しを戻します。if文の基本的な書き方はすでに見てきたので、1歩進んでelse文です。
次のコードを入力し、実行してみてください。

code7-3.php

<?php
$a = 10;
$b = 8;

if( $a < $b ) {
    echo '$bの値の方が大きい';
} else {
    echo '$aの値の方が大きい';
}

このコードをそのまま実行すると、「$aの値の方が大きい」と出力されると思います。
$a$bの値を変えてみて出力の変化を見てみると、if文がどういう動きをしているかが分かります。

else {}は、if文の条件式で判定が「false」だった場合に実行されます。
つまり、条件式が正しい(true)場合はif( 条件式 ) {}の中の処理を実行し、正しくない(false)場合はelse {}の中の処理を実行する、ということです。必ずどちらかしか実行されません。

このようにif文を書けるようになったことで、冒頭で書いた通り「プログラムに判断する力」を与えることができるようになりました。
さらにもう1歩進んで、「高度に判断する力」を与えてみましょう。

elseif文

if文は「Aの処理か、Bの処理か」の2択だけでなく、「Aの処理かBの処理か、それともCの処理か」といった形にすることも可能です。それが、「elseif文」です。
単純にif文の条件式が増えるものですが、説明よりもコードの方がイメージしやすいと思います。先ほどの「code7-3.php」を次のように変更してください。

code7-3.php(修正)

<?php
$a = 10;
$b = 8;

if( $a < $b ) {
    echo '$bの値の方が大きい';
} elseif( $a === $b ) {
    echo '$aと$bの値は等しい';
} else {
    echo '$aの値の方が大きい';
}

if文に条件式が一つ増えました。そのまま実行した場合は修正前と出力結果が変わりませんが、$aの値を「8」にして実行すると、追加したelseif文の式で「true」となって「$aと$bの値は等し」という出力になるはずです。

このように、if文では上から順に条件式を判定していって、最終的に正しい式がなかったときはelse文を実行する流れになっています。そして、elseif文は必要に応じて複数書くこともできます。

code7-3.php(修正)

<?php
$a = 10;
$b = 8;
$c = 5;

if( $a < $b ) {
    echo '$aより$bの値の方が大きい';
} elseif( $a === $b ) {
    echo '$aと$bの値は等しい';
} elseif( $c < $a ) {
    echo '$aは$cより大きい';
} elseif( $b === $c ) {
    echo '$bと$cの値は等しい';
} else {
    echo '$aの値の方が大きい';
}

まとめ

これで、プログラミングの基本構文の1つである「if文」を扱えるようになりました。次の章では、複数の条件分岐を効率良く書く方法を学んでいきます。

この章で学んだこと

  • if文を使って、実行する処理を「条件分岐」させることができる
  • if文は必要に応じて「elseif文」を使って複数の条件分岐をさせることができる
  • if文の条件式には「比較演算子」を使うことができる
  • 値には主に「整数」「論理」「浮動小数点数」「文字列」「NULL」の5つの「型」がある

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。