プログラム言語のキホンである変数、条件判定とループ:PHPではどう表すのか?
真偽値(true、false)による判定
通常、プログラムには分岐点がいくつもあります。例えば新規ユーザー登録をする場合、以下のような分岐点が考えられるでしょうか。
分岐点では、条件式(お題のこと)がYESかNOかによって、その後の処理が分岐されます。このYESかNOかというのは、プログラミングでは「true(真)」と「false(偽)」と表現します。PHPでは数字、文字、式のすべてが、trueまたはfalseのどちらかに振り分けられます。
型(値の種類のこと) | 値 | 真偽値 |
---|---|---|
真偽値 | true | true |
false | false | |
数値 | -1 | true |
0 | false | |
0.123 | true | |
1 | true | |
文字列 | “” | false |
“ “ | true | |
“0” | true | |
"abc!" | true | |
数式 | 1 + 2 | true |
1 - 1 | false | |
その他 | ヌル値(null) | false |
未定義の変数 | false |
特に注意したいのは、数値の0はfalseですが、文字の「0」はtrueだというところです。数値の1や0というのは、数量があるかないかを表すので、それぞれtrueとfalseになります。一方、文字の「0」には「ない」という意味はなく、この形の文字(コンピュータ的には文字コード)が「存在している」ということなので、trueになります。同様に、文字列の「zero」や「零」もtrueです。
if文による条件分岐
このtrueとfalseを使って処理を分岐するためには、主に「if文」を使います。if文の文法は以下のようになります。
※この書き方はif文の範囲が分かりにくいので、構文(2)の例のように{}を使った方がよいでしょう。
※この書き方はif文、else文の範囲が分かりにくいので、構文(4)のように{}を使った方がよいでしょう。
※この書き方はif文、elseif文、else文の範囲が分かりにくいので、構文(6)のように{}を使った方がよいでしょう。
※elseifはいくつでも増やすことができます。
※elseifはelse ifと分けて書いても同じ処理をします。
A や B は、条件式といいます。条件式には数値や文字列などを直接入れたり
変数を入れたり
関数を入れることができます。
これらの判定を逆にしたい場合は、「否定演算子(!)」を使います。
比較演算子
さらに条件式には、以下のような比較演算子を入れることができます。
等価判定
A == B
AとBが等しい場合はtrue、そうでない場合はfalseになります。AとBの種類(型)が違う場合は、どちらかに合わせて判断されます。
評価式 | 真偽値 | メモ |
---|---|---|
1 == 1 | true | |
1 == “1” | true | 数値と文字の比較 |
1 == 2 | false | |
1 == true | true | if (1) と同じ |
0 == false | true | if (!0) と同じ |
'abc' == 'abc' | true | |
'abc' == ' abc ' | false | 空白あり |
'abc' == 'ABC' | false | 小文字と大文字の比較 |
1 + 2 == 3 | true | 計算式の比較(左辺) |
1 == 3 % 2 | true | 計算式の比較(右辺) |
A === B
AとBの型も値も等しい場合はtrue、そうでない場合はfalseになります。
評価式 | 真偽値 | メモ |
---|---|---|
1 === 1 | true | |
1 === '1' | false | 型が違う |
1 === true | false | 型が違う |
'abc' === 'abc' | true |
不等価判定
等価判定の逆バージョンです。
A != B
AとBが等しくない場合はtrue、そうでない場合はfalseになります。AとBの種類(型)が違う場合は、どちらかに合わせて判断されます。
評価式 | 真偽値 | メモ |
---|---|---|
1 != 1 | false | |
1 != 2 | true | |
1 != true | false | |
1 != false | true | |
'abc' != 'abc' | false | |
'abc' != ' abc ' | true |
A !== B
AとBの型か値が等しくない場合はtrue、そうでない場合はfalseになります。
評価式 | 真偽値 | メモ |
---|---|---|
1 !== 1 | false | |
1 !== '1' | true | 型が違う |
1 !== true | true | 型が違う |
'abc' !== 'abc' | false |
大小の比較
大小を比較する演算子は4種類あります。少しでもバグを減らすために、数値なら数値、文字なら文字と、比較するもの同士の型は揃えるようにしましょう。違う型同士で比較すると、予想外の結果になることがあります。
A
AがBより小さい場合はtrue、そうでない場合はfalseになります。
評価式 | 真偽値 | メモ |
---|---|---|
1 | false | |
1 | false | |
1 | true |
A > B
AがBより大きい場合はtrue、そうでない場合はfalseになります。
評価式 | 真偽値 | メモ |
---|---|---|
0 > 1 | false | |
1 > 1 | false | |
2 > 1 | true |
A
AがBより小さい、または等しい場合はtrue、そうでない場合はfalseになります。
評価式 | 真偽値 | メモ |
---|---|---|
1 | false | |
1 | true | |
1 | true |
A >= B
AがBより大きい、または等しい場合はtrue、そうでない場合はfalseになります。
評価式 | 真偽値 | メモ |
---|---|---|
0 >= 1 | false | |
1 >= 1 | true | |
2 >= 1 | true |
種類(型)の異なるものを比較すると、どちらかの型に合わせて判断されます。
小数を比較する際の注意点
コンピュータでは扱える小数点の桁数(有効桁数)に限りがあるため、正確に表せない小数がたくさんあります。PHPでは多すぎる小数点の桁数は丸めるので、小数同士を比較しようとすると、意図しない結果になることも少なくありません。しかもどの小数が不正確なのかは、見ただけでは分かりません。例えば十進数では簡単な小数に見える0.1のような数も、PHPの内部では二進数で扱われるため、無限小数(の桁数を丸めたもの)になっています。以下の簡単な例で確認できます。
これはとても簡単な足し算に見えますが、$x == 0.8はtrueになりません。$x は0.8のように見えますが、内部では「0.79999999999999991118...」というようになっているのです。ですので、小数同士を比較する場合は常に、小数点以下何桁までを含めて比較するかという「有効桁数」を意識する必要があります。
具体的には以下のような方法が考えられます。
- 比較したい桁までが整数になるように10x倍する
- 2つの値の差が有効桁数以内で0なら等しいとする
(例:if(abs(1.2345 – 1.2346) - 複雑な小数を扱うためのPHPライブラリを使う
文字列の比較をするときの注意点
文字列の大小は、辞書を基準に決められています。英語ならばアルファベット順、日本語ならば五十音順ですので、例えば「おおきい」は「ちいさい」よりも小さくなります(お
文字列型の数字を「」などの演算子を使って比較しても、数値として比較されてしまいます。もし文字列として比較をしたい場合は「strcmp」という関数を使うとよいでしょう。
論理演算子
複数の条件式をつないで、もっと複雑な条件式を作ることもできます。以下の「論理演算子」を用いて、条件式をいくつでもつなぐことができます。
A || B | または | AまたはBがtrueならばtrue。それ以外はfalse |
---|---|---|
A && B | かつ | AとBがともにtrueならばtrue。それ以外はfalse(||より優先) |
※優先順位を変えるにはカッコを使います。