is_numberじゃない?phpの数値判定を簡単理解で初心者脱出

phpを学んで少し経った頃の私に、数値を判定する機会が訪れました。

is_nullという空文字判定の機能を知ったばかりの私は、考えました。

is_nullでnullが判定できるなら、is_numberという関数もあるのでは??

・・・得意気に検索してみたのですが、is_numberという関数は存在しませんでした。

私が探していた関数は、is_numericという関数でした。

初心者の頃はこんな事を繰り返していました。

私と同じようにis_number関数が存在すると思ってここにたどり着いた方もいるかもしれませんので、今回は、数値のチェック関数についてお話しようと思います。

目次

そもそも数値のチェックが必要な理由

phpは、型の宣言が必要ないプログラムと呼ばれたりもします。

型とは、変数の中に代入する値の種類を表します。
phpにも型は存在します。

int ・・・1や100などの整数型。
float/double・・・浮動小数点数です。ざっくり言うと少数です。
string・・・りんご、ばなな、などの文字列です
boolean・・・trueかfalseのどちらかです。

ただ、次のテストコードを見てください。

<?php

    $test_result = 100;

    echo $test_result; // ★出力1

    $test_result ="テストの結果はよかったです";

    echo $test_result; // ★出力2

    $test_result = true;

    echo $test_result; // ★出力3

?>

■結果

100 // ★出力1
テストの結果はよかったです // ★出力2
1 // ★出力3

型の宣言も必要なく、同じ変数にどんな値でも追加する事が出来ました。

すごく便利じゃない!?

そう思われましたか?

でも、例えば変数同士の計算が発生した以下の場合などはどうでしょうか。

<?php

    $test_mathe_result = 100;
    $test_english_result = "とてもよかった";

    $test_result = $test_mathe_result + $test_english_result ; // 100 + とてもよかった

    echo $test_result; // ★出力1

?>

■結果

100 // ★出力1

数値と文字列を足すと文字列は無視されますので、結果は100です。

テストの点数を足したい場合は、両方とも数値が入ってくる!当たり前じゃん!意地悪な問題だな、と思われたかもしれませんが、プログラムではそういった当たり前は通じません。

$test_english_resultが数値でない場合は、計算をするべきではないのです。
※またログ上にも「おかしな処理がある」とWarning(警告)が表示されてしまいます。

バグやユーザーの操作で、自分が思った以外の数値が渡される場合もあります。

そんな時にチェックを行ってくれる関数が有効です。

今回はis_numericというものを使ってみます。

◆数値チェックの結果が正(true)の場合

<?php

    $test_mathe_result = 100;
    $test_english_result = 90;

    if(is_numeric($test_mathe_result) && is_numeric($test_english_result)){  // 数値かどうか判定
        $test_result = $test_mathe_result + $test_english_result ;
        echo $test_result; // ★出力1
    } else {
        echo "エラーです。"; // ★出力2
    }
?>

■結果

190 // ★出力1

◆数値チェックの結果が偽(false)の場合

<?php

    $test_mathe_result = 100;
    $test_english_result = "とてもよかった";

    if(is_numeric($test_mathe_result) && is_numeric($test_english_result)){  // 数値かどうか判定
        $test_result = $test_mathe_result + $test_english_result ;
        echo $test_result; // ★出力1
    } else {
        echo "エラーです。"; // ★出力2
    }
?>

■結果

エラーです。 // ★出力2

プログラムでは、変数の中身や渡された値が、数値なのか文字列なのか判定する場面が多く存在します。

また、それらを確認する為にphpには色々な内部関数(ビルトイン関数)というphpにあらかじめ準備されている関数があります。

is_numericも内部関数です。

※内部関数以外に、ユーザー定義関数という自由に設定出来る関数があります。

次の項目では、数値チェックのための内部関数の説明をしていこうと思います。

これだけ覚える!php数値チェック

それでは、これだけは覚えおくときっと役に立つphp数値チェックの内部関数を書いていきます。

is_numeric

数値であるかどうかを判断します。

型が文字列であっても、数値として判断される部分が重要です。

以下の場合は全てtrue(正)が返ってきます。

is_numeric('99');
is_numeric(100);
is_numeric(2.1);

■結果

true
true
true

以下の場合は全てfalse(偽)が返ってきます。

is_numeric("ng_test");
is_numeric(null);
is_numeric(array());

■結果

false
false
false

is_int

整数型intかどうかを判定します。

’99’などの文字列はfalseとなります。

以下の場合はtrue(正)が返ってきます。

is_int(99);

■結果

true

以下の場合は全てfalse(偽)が返ってきます。

is_int('99');
is_int(9.9);
is_int('9.9');
is_int("ng_test");
is_int(null);
is_int(array());

■結果

false
false
false
false
false
false

ctype_digit

文字列stringかどうかを判定します。

is_numericと違う点は、string文字列でない場合、falseになってしまう事です。

以下の場合はtrue(正)が返ってきます。

ctype_digit('99');

■結果

true

以下の場合は全てfalse(偽)が返ってきます。

ctype_digit(99);
ctype_digit(9.9);

■結果

false
false

phpの数値比較の落とし穴

最後に数値を比較する場合に少し戸惑う事もあるかも!というお話をさせて頂きます。

テストコードを見てください。

<?php
    $num = 0;
    $negative_comment = 'NoGood';
    
    if($negative_comment == $num){
        echo 'OK';
    } else {
        echo 'NG';
    }
?>

■結果

OK

0という数値とNoGoodという文字列を比べているんだからNGになるでしょう!と思いましたか?

普通そう思いますよね。実は以下のphpの比較演算子のルールでは以下のようなものがあるのです。

整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が 数値に変換され、 数値としての比較を行います

参考:http://www.php.net/manual/ja/language.operators.comparison.php

この点を知らないと、予期せぬ値が変数に入ってしまった時に慌てることになるのです。

実際慌てたのは…私です。

まとめ

今回はis_numericをはじめとする、phpの数値チェック全般についてお話いたしました。

関数の正式な名前がわからなくても、自分の悩みや単語をすべて検索窓に入れれば、今の時代誰かの同じような疑問から自分の目的にたどり着く事もできます。

参考書しか学ぶ方法がなかった時代から考えるとすごく恵まれています。

大事なのはあきらめずに少しずつでも進むことかなと思います。

それではまた。

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次