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() の結果は、次のとおりです。
| 値 | 判定結果 |
|---|---|
123 | true |
"123" | true |
12.5 | true |
"12.5" | true |
"-123" | true |
"+123" | true |
"1e3" | true |
"abc" | false |
"123abc" | false |
null | false |
true | false |
たとえば、複数の値をまとめて確認する場合は、次のように書けます。
$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 "整数型です";
}
この場合、$value は int 型なので条件が成立します。
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" | 123 | 12.5 |
|---|---|---|---|---|
is_numeric() | 数値として扱えるか | true | true | true |
is_int() | int型か | false | true | false |
is_float() | float型か | false | false | true |
「数値として利用できる値か」を調べるなら 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 になります。
しかし、条件式では 0 は false と評価されます。
そのため、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_range・max_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で値が数値かどうか判定する方法についてでした。
最後までお読みいただき、ありがとうございました。










