PHPで値が数値かどうか判定する方法について

採用はこちら

PHPで値が数値かどうかを判定する場合は、主に is_numeric() 関数を使用します。

ただし、「数値として扱える値かどうか」を判定したいのか、「実際の型が整数なのか」「小数なのか」を判定したいのかによって、使用する関数は異なります。

PHPでは数値そのものだけでなく、"123""12.5" のような数値形式の文字列も扱うことが多いため、目的に応じて関数を使い分けることが重要です。

目次

is_numeric()で数値かどうか判定する

is_numeric()の基本的な使い方

is_numeric() は、値が数値、または数値として解釈できる文字列かどうかを判定する関数です。

基本的な書き方は次のとおりです。

is_numeric($value);

数値として認識できる場合は true、それ以外の場合は false が返されます。

たとえば、次のように使用できます。

$value = "123";

if (is_numeric($value)) {
    echo "数値です";
} else {
    echo "数値ではありません";
}

この場合、"123" は文字列ですが数値として解釈できるため、「数値です」と表示されます。

整数はtrueになる

整数型の値は、is_numeric()true になります。

var_dump(is_numeric(123));

実行結果は次のとおりです。

bool(true)

数値形式の文字列もtrueになる

is_numeric() の大きな特徴は、数値形式の文字列も判定できることです。

var_dump(is_numeric("123"));

実行結果は次のとおりです。

bool(true)

フォームやURLパラメータなどから受け取った値は文字列になることが多いため、このような場面では is_numeric() が便利です。

小数も判定できる

is_numeric() は整数だけでなく、小数も数値として判定します。

var_dump(is_numeric(12.5));
var_dump(is_numeric("12.5"));

実行結果は次のとおりです。

bool(true)
bool(true)

実際の float 型だけでなく、"12.5" のような数値形式の文字列も true になります。

負の数や指数表記も判定できる

is_numeric() は、負の数や指数表記にも対応しています。

var_dump(is_numeric("-123"));
var_dump(is_numeric("+123"));
var_dump(is_numeric("1e3"));

これらはいずれも true になります。

そのため、is_numeric() は「0〜9だけで構成されているか」を確認する関数ではありません。

単純な数字列だけを判定したい場合は、別の方法を使用する必要があります。

is_numeric()で判定される代表的な値

判定結果の例

代表的な値に対する is_numeric() の結果は、次のとおりです。

判定結果
123true
"123"true
12.5true
"12.5"true
"-123"true
"+123"true
"1e3"true
"abc"false
"123abc"false
nullfalse
truefalse

たとえば、複数の値をまとめて確認する場合は、次のように書けます。

$values = [
    123,
    "123",
    12.5,
    "12.5",
    "-123",
    "abc",
    "123abc",
];

foreach ($values as $value) {
    var_dump($value, is_numeric($value));
}

PHP 8以降では末尾に空白がある数値文字列もtrueになる

PHP 8.0以降では、末尾に空白を含む数値文字列も is_numeric()true になる場合があります。

var_dump(is_numeric("42 "));

PHP 8.0以降では、結果は次のようになります。

bool(true)

古いPHPとは挙動が異なるため、PHPのバージョンによる違いには注意が必要です。

ユーザー入力を厳密に検証したい場合は、is_numeric() だけではなく、入力仕様に応じた追加チェックを行うとよいでしょう。

整数型かどうか判定する方法

is_int()を使用する

値そのものが整数型であるかを確認したい場合は、is_int() を使用します。

$value = 123;

if (is_int($value)) {
    echo "整数型です";
}

この場合、$valueint 型なので条件が成立します。

var_dump(is_int(123));

実行結果は次のとおりです。

bool(true)

“123”は整数型ではない

is_int() は、数値として扱えるかではなく、実際のデータ型を確認する関数です。

そのため、次のコードでは false になります。

var_dump(is_int("123"));

結果は次のとおりです。

bool(false)

"123" は数値形式の文字列ですが、PHP上では string 型だからです。

$value = "123";

var_dump(is_numeric($value));
var_dump(is_int($value));

結果は次のようになります。

bool(true)
bool(false)

この違いを理解しておくことが、PHPで数値判定を行ううえで重要です。

小数型かどうか判定する方法

is_float()を使用する

値そのものが float 型かどうかを判定したい場合は、is_float() を使用します。

$value = 12.5;

if (is_float($value)) {
    echo "小数型です";
}

実行すると、「小数型です」と表示されます。

数値文字列の小数はfalseになる

次のように、文字列として格納された小数は is_float() では false になります。

var_dump(is_float("12.5"));

実行結果は次のとおりです。

bool(false)

一方で、is_numeric() なら true になります。

var_dump(is_numeric("12.5"));

結果は次のとおりです。

bool(true)

つまり、is_float() は小数として解釈できるかを確認する関数ではなく、値の型そのものを確認する関数です。

is_numeric()・is_int()・is_float()の違い

3つの関数を比較する

それぞれの違いを整理すると、次のようになります。

関数判定する内容"123"12312.5
is_numeric()数値として扱えるかtruetruetrue
is_int()int型かfalsetruefalse
is_float()float型かfalsefalsetrue

「数値として利用できる値か」を調べるなら is_numeric() が基本です。

一方で、型そのものを確認したい場合は、is_int()is_float() を使用します。

数字だけの文字列を判定する方法

ctype_digit()を使用する

"12345" のように、0〜9の数字だけで構成された文字列かどうかを判定したい場合は、ctype_digit() を使用できます。

$value = "12345";

if (ctype_digit($value)) {
    echo "数字だけで構成されています";
}

ctype_digit() は、すべての文字が数字である場合に true を返します。

負の数や小数はfalseになる

ctype_digit() は符号や小数点を数字として扱わないため、次のような値は false になります。

var_dump(ctype_digit("-123"));
var_dump(ctype_digit("12.5"));

どちらも結果は false です。

一方、is_numeric() では次の値はいずれも true になります。

var_dump(is_numeric("-123"));
var_dump(is_numeric("12.5"));

したがって、数値全般を判定する場合は is_numeric()、0〜9だけの文字列を判定する場合は ctype_digit() と使い分けます。

PHP 8.1以降では文字列を渡す

PHP 8.1以降では、ctype_digit() に文字列以外の値を渡す使い方は非推奨となっています。

そのため、基本的には次のように文字列を対象として使用します。

$value = "123";

var_dump(ctype_digit($value));

整数などを確認する必要がある場合は、必要に応じて文字列に変換します。

$value = 123;

var_dump(ctype_digit((string) $value));

フォーム入力の数値を判定する方法

is_numeric()で入力値を確認する

PHPでは、フォームから送信された値は文字列として扱われることが一般的です。

たとえば、次のようなフォームがあるとします。

<input type="text" name="age">

PHP側では、次のように値を取得できます。

$age = $_POST['age'] ?? '';

数値として扱えるか確認するなら、is_numeric() を使用します。

if (is_numeric($age)) {
    echo "数値が入力されています";
} else {
    echo "数値を入力してください";
}

フォーム入力では "20" のような値が文字列になることが多いため、is_int() より is_numeric() が適している場合があります。

整数だけ入力可能にする方法

filter_var()で整数を検証する

整数だけを許可したい場合は、filter_var()FILTER_VALIDATE_INT を利用できます。

$value = "123";

if (filter_var($value, FILTER_VALIDATE_INT) !== false) {
    echo "整数です";
}

この方法では、整数として有効な値かどうかを検証できます。

!== falseで比較する

FILTER_VALIDATE_INT を使用するときは、結果を false と厳密比較することが重要です。

たとえば、

$value = "0";

の場合、検証に成功すると整数の 0 が返されます。

そのため、次のように書く必要があります。

if (filter_var($value, FILTER_VALIDATE_INT) !== false) {
    echo "有効な整数です";
}

次のような書き方は避けたほうがよいでしょう。

if (filter_var($value, FILTER_VALIDATE_INT)) {
    echo "有効な整数です";
}

整数の 0 はPHPの条件式で false と評価されるため、正しい入力にもかかわらず条件を満たさなくなってしまいます。

数値の範囲まで検証する方法

min_rangeとmax_rangeを設定する

フォーム入力では、単純に整数かどうかだけでなく、値の範囲まで確認したい場合があります。

たとえば、年齢を0〜150の範囲に制限する場合は、次のようにできます。

$age = "20";

if (
    filter_var(
        $age,
        FILTER_VALIDATE_INT,
        [
            'options' => [
                'min_range' => 0,
                'max_range' => 150,
            ],
        ]
    ) !== false
) {
    echo "有効な年齢です";
}

このようにすれば、整数かどうかだけでなく、指定した範囲に収まっているかどうかも同時に検証できます。

ユーザー入力では「数値かどうか」と「アプリケーション上、有効な値かどうか」を分けて考えることが重要です。

intval()で数値判定しない

intval()は整数変換用の関数

intval() は値を整数に変換する関数であり、数値かどうかを判定するための関数ではありません。

$value = "123";

$result = intval($value);

var_dump($result);

実行結果は次のとおりです。

int(123)

そのため、次のように intval() の戻り値だけで数値判定をするのは適切ではありません。

if (intval($value)) {
    echo "数値です";
}

0を正しく判定できない

たとえば、

intval("0");

の結果は整数の 0 になります。

しかし、条件式では 0false と評価されます。

そのため、intval() の結果をそのまま条件式にすると、正常な数値である "0" を正しく判定できません。

数値判定を行う場合は、

if (is_numeric($value)) {
    // 数値として処理する
}

のように、判定用の関数を使用します。

数値判定後に整数へ変換する方法

キャストでint型へ変換する

数値であることを確認してから整数型に変換する場合は、次のように書けます。

$value = "123";

if (is_numeric($value)) {
    $number = (int) $value;

    var_dump($number);
}

実行結果は次のとおりです。

int(123)

ただし、is_numeric() は小数も true にするため注意が必要です。

$value = "12.8";

if (is_numeric($value)) {
    $number = (int) $value;

    var_dump($number);
}

結果は次のようになります。

int(12)

小数部分が失われるため、整数だけを許可したい場合は FILTER_VALIDATE_INT などで事前に検証するほうが適切です。

正規表現で数値形式を判定する方法

独自の入力ルールを設定できる

特定の形式だけを許可したい場合は、正規表現を使用する方法もあります。

たとえば、数字だけの文字列を許可する場合は次のように書けます。

$value = "12345";

if (preg_match('/^\d+$/', $value)) {
    echo "数字だけです";
}

負の整数も許可する場合は、次のようにできます。

if (preg_match('/^-?\d+$/', $value)) {
    echo "整数形式です";
}

正規表現が向いているケース

単純に数値かどうか確認するだけであれば、is_numeric() のほうが簡潔です。

正規表現は、次のような独自ルールを設定したい場合に向いています。

  • 3桁の数字だけ許可する
  • 負の数を禁止する
  • 小数点以下2桁まで許可する
  • 特定のフォーマットだけを許可する

入力条件が細かい場合には、preg_match() を使った検証も選択肢になります。

PHPで数値判定するときの使い分け

目的別に関数を選ぶ

PHPで数値を判定する場合は、目的に応じて次のように使い分けると分かりやすいです。

判定したい内容使用する方法
数値または数値文字列かis_numeric()
実際の型が整数かis_int()
実際の型がfloatかis_float()
0〜9だけの文字列かctype_digit()
入力値が有効な整数かfilter_var() + FILTER_VALIDATE_INT
整数の範囲まで検証したいmin_rangemax_range
独自の数値形式を検証したいpreg_match()

数値として扱えるかどうかだけを確認したいのであれば、基本的には次のコードで対応できます。

if (is_numeric($value)) {
    echo "数値です";
}

PHPで値が数値か判定するならis_numeric()が基本

PHPで値が数値かどうかを判定する場合は、まず is_numeric() を検討するとよいでしょう。

is_numeric() は整数や小数だけでなく、"123""12.5" のような数値形式の文字列にも対応しています。

一方、実際のデータ型を確認したい場合は is_int()is_float()、0〜9だけで構成された文字列を確認したい場合は ctype_digit() が適しています。

また、フォームなどのユーザー入力を検証する場合は、単に数値かどうかを見るだけではなく、FILTER_VALIDATE_INT や範囲指定を使って、アプリケーションの仕様に合った値かどうかまで確認することが重要です。

目的に応じて判定方法を使い分けることで、より正確で安全なPHPコードを実装できます。

以上、PHPで値が数値かどうか判定する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次