プログラム言語のキホンである変数、条件判定とループ:PHPではどう表すのか?

2015年2月9日(月)
野田 貴子

真偽値(true、false)による判定

通常、プログラムには分岐点がいくつもあります。例えば新規ユーザー登録をする場合、以下のような分岐点が考えられるでしょうか。

プログラムでの分岐処理の例(新規ユーザーの登録)

図2:プログラムでの分岐処理の例(新規ユーザーの登録)

分岐点では、条件式(お題のこと)がYESかNOかによって、その後の処理が分岐されます。このYESかNOかというのは、プログラミングでは「true(真)」と「false(偽)」と表現します。PHPでは数字、文字、式のすべてが、trueまたはfalseのどちらかに振り分けられます。

PHP:論理型 (boolean) - Manual

表3:値と真偽値の対照

型(値の種類のこと)真偽値
真偽値truetrue
falsefalse
数値-1true
0false
0.123true
1true
文字列“”false
“ “true
“0”true
"abc!"true
数式1 + 2true
1 - 1false
その他ヌル値(null)false
未定義の変数false

特に注意したいのは、数値の0はfalseですが、文字の「0」はtrueだというところです。数値の1や0というのは、数量があるかないかを表すので、それぞれtrueとfalseになります。一方、文字の「0」には「ない」という意味はなく、この形の文字(コンピュータ的には文字コード)が「存在している」ということなので、trueになります。同様に、文字列の「zero」や「零」もtrueです。

if文による条件分岐

このtrueとfalseを使って処理を分岐するためには、主に「if文」を使います。if文の文法は以下のようになります。

構文(1)

if (A) /* Aがtrueの場合セミコロンまで処理が実行される */ ;

※この書き方はif文の範囲が分かりにくいので、構文(2)の例のように{}を使った方がよいでしょう。

構文(2)

if (A) {
    // Aがtrueの場合
    // ここに書かれた処理が実行される
}

構文(3)

if (A) /* Aがtrueの場合セミコロンまで処理が実行される */ ;
else /* それ以外(Aがfalse)の場合セミコロンまで処理が実行される */ ;

※この書き方はif文、else文の範囲が分かりにくいので、構文(4)のように{}を使った方がよいでしょう。

構文(4)

if (A) {
    // Aがtrueの場合
    // ここに書かれた処理が実行される
}
else {
    // それ以外(Aがfalse)の場合
    // ここに書かれた処理が実行される
}

構文(5)

if (A); /* Aがtrueの場合セミコロンまで処理が実行される */ ;
elseif /* AがfalseでBがtrueの場合セミコロンまで処理が実行される */ ;
else /* それ以外(A、Bともにfalse)の場合セミコロンまで処理が実行される */ ;

※この書き方はif文、elseif文、else文の範囲が分かりにくいので、構文(6)のように{}を使った方がよいでしょう。
※elseifはいくつでも増やすことができます。
※elseifはelse ifと分けて書いても同じ処理をします。

構文(6)

if (A) {
    // Aがtrueの場合
    // ここの処理が実行される
}
elseif (B) {
    // AがfalseでBがtrueの場合
    // ここの処理が実行される
}
else {
    // それ以外(A、Bともにfalse)の場合
    // ここの処理が実行される
}

A や B は、条件式といいます。条件式には数値や文字列などを直接入れたり

if (true) {
    // 実行されます
}
if (0) {
    // 実行されません
}
if ("abc") {
    // 実行されます
}

変数を入れたり

$userId = 123;
if ($userId) {
    // 実行されます
}
$check = false;
if ($check) {
    // 実行されません
}

関数を入れることができます。

$name = "JohnSmith";
if (strlen($name)) { // 9 なので true
    // 実行されます
}

これらの判定を逆にしたい場合は、「否定演算子(!)」を使います。

if (true) {
    // 実行されます
}
if (!true) {
    // 実行されません
}

$count = 0;
if ($count) {
    // 実行されません
}
if (!$count) {
    // 実行されます
}

比較演算子

さらに条件式には、以下のような比較演算子を入れることができます。

等価判定

A == B

AとBが等しい場合はtrue、そうでない場合はfalseになります。AとBの種類(型)が違う場合は、どちらかに合わせて判断されます。

PHP:比較演算子 - Manual

表4:等価判定の例(==)

評価式真偽値メモ
1 == 1true
1 == “1”true数値と文字の比較
1 == 2false
1 == truetrueif (1) と同じ
0 == falsetrueif (!0) と同じ
'abc' == 'abc'true
'abc' == ' abc 'false空白あり
'abc' == 'ABC'false小文字と大文字の比較
1 + 2 == 3true計算式の比較(左辺)
1 == 3 % 2true計算式の比較(右辺)

A === B

AとBの型も値も等しい場合はtrue、そうでない場合はfalseになります。

表5:等価判定の例(===)

評価式真偽値メモ
1 === 1true
1 === '1'false型が違う
1 === truefalse型が違う
'abc' === 'abc'true

不等価判定

等価判定の逆バージョンです。

A != B

AとBが等しくない場合はtrue、そうでない場合はfalseになります。AとBの種類(型)が違う場合は、どちらかに合わせて判断されます。

表6:不等価判定の例(!=)

評価式真偽値メモ
1 != 1false
1 != 2true
1 != truefalse
1 != falsetrue
'abc' != 'abc'false
'abc' != ' abc 'true

A !== B

AとBの型か値が等しくない場合はtrue、そうでない場合はfalseになります。

表7:不等価判定の例(!==)

評価式真偽値メモ
1 !== 1false
1 !== '1'true型が違う
1 !== truetrue型が違う
'abc' !== 'abc'false

大小の比較

大小を比較する演算子は4種類あります。少しでもバグを減らすために、数値なら数値、文字なら文字と、比較するもの同士の型は揃えるようにしましょう。違う型同士で比較すると、予想外の結果になることがあります。

A

AがBより小さい場合はtrue、そうでない場合はfalseになります。

表8:大小の比較(

評価式真偽値メモ
1 false
1 false
1 true

A > B

AがBより大きい場合はtrue、そうでない場合はfalseになります。

表9:大小の比較(>)

評価式真偽値メモ
0 > 1false
1 > 1false
2 > 1true

A

AがBより小さい、または等しい場合はtrue、そうでない場合はfalseになります。

表10:大小の比較(

評価式真偽値メモ
1 false
1 true
1 true

A >= B

AがBより大きい、または等しい場合はtrue、そうでない場合はfalseになります。

表11:大小の比較(>=)

評価式真偽値メモ
0 >= 1false
1 >= 1true
2 >= 1true

種類(型)の異なるものを比較すると、どちらかの型に合わせて判断されます。

小数を比較する際の注意点

コンピュータでは扱える小数点の桁数(有効桁数)に限りがあるため、正確に表せない小数がたくさんあります。PHPでは多すぎる小数点の桁数は丸めるので、小数同士を比較しようとすると、意図しない結果になることも少なくありません。しかもどの小数が不正確なのかは、見ただけでは分かりません。例えば十進数では簡単な小数に見える0.1のような数も、PHPの内部では二進数で扱われるため、無限小数(の桁数を丸めたもの)になっています。以下の簡単な例で確認できます。

<?php
$x = 0.1 + 0.7;
var_dump($x); // 0.8
var_dump($x == 0.8); // false
?>

これはとても簡単な足し算に見えますが、$x == 0.8はtrueになりません。$x は0.8のように見えますが、内部では「0.79999999999999991118...」というようになっているのです。ですので、小数同士を比較する場合は常に、小数点以下何桁までを含めて比較するかという「有効桁数」を意識する必要があります。

具体的には以下のような方法が考えられます。

  • 比較したい桁までが整数になるように10x倍する
  • 2つの値の差が有効桁数以内で0なら等しいとする
    (例:if(abs(1.2345 – 1.2346)
  • 複雑な小数を扱うためのPHPライブラリを使う

文字列の比較をするときの注意点

文字列の大小は、辞書を基準に決められています。英語ならばアルファベット順、日本語ならば五十音順ですので、例えば「おおきい」は「ちいさい」よりも小さくなります(お

文字列型の数字を「」などの演算子を使って比較しても、数値として比較されてしまいます。もし文字列として比較をしたい場合は「strcmp」という関数を使うとよいでしょう。

論理演算子

複数の条件式をつないで、もっと複雑な条件式を作ることもできます。以下の「論理演算子」を用いて、条件式をいくつでもつなぐことができます。

表12:論理演算子

A || BまたはAまたはBがtrueならばtrue。それ以外はfalse
A && BかつAとBがともにtrueならばtrue。それ以外はfalse(||より優先)

※優先順位を変えるにはカッコを使います。

<?php
if (1 + 2 === 3 && (“This is a test.” || 0)) {
    // true && (true || false) なので
    // 実行されます
}
?>

1983年生まれ。大学卒業後、ソフトウェア開発の営業を経て、ソフトウェア開発業務に転向。現在は自社パッケージのフロントエンド開発のほか、PHPでの受託開発案件、日→英のローカライズ案件などを担当。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています