[PHP]is_numeric関数の使い方を徹底解説!数値判定の基本から応用まで

PHP

PHPで数値の判定を行う際に欠かせない関数がis_numeric()です。この関数を正しく理解して使うことで、より安全で信頼性の高いプログラムを書くことができます。今回は、is_numeric()関数の基本的な使い方から、実際の開発現場での応用例まで詳しく解説します。

is_numeric関数とは?

is_numeric()は、指定された値が数値または数値文字列かどうかを判定するPHPの組み込み関数です。戻り値はtrue(数値の場合)またはfalse(数値以外の場合)のブール値となります。

基本的な構文

is_numeric(mixed $value): bool

パラメータ:

  • $value:判定したい値(任意の型)

戻り値:

  • bool:数値の場合はtrue、そうでなければfalse

基本的な使い方

まずは基本的な使用例を見てみましょう。

<?php
// 整数の場合
var_dump(is_numeric(123));        // bool(true)
var_dump(is_numeric(-456));       // bool(true)

// 浮動小数点数の場合
var_dump(is_numeric(3.14));       // bool(true)
var_dump(is_numeric(-2.5));       // bool(true)

// 文字列の数値の場合
var_dump(is_numeric("123"));      // bool(true)
var_dump(is_numeric("3.14"));     // bool(true)
var_dump(is_numeric("-456"));     // bool(true)

// 数値以外の場合
var_dump(is_numeric("hello"));    // bool(false)
var_dump(is_numeric("123abc"));   // bool(false)
var_dump(is_numeric(""));         // bool(false)
?>

is_numeric関数が判定できる値の種類

is_numeric()関数は以下の形式の値を数値として認識します:

1. 整数(正の数・負の数・ゼロ)

is_numeric(0);      // true
is_numeric(123);    // true
is_numeric(-789);   // true

2. 浮動小数点数

is_numeric(3.14);   // true
is_numeric(-2.5);   // true
is_numeric(0.0);    // true

3. 数値文字列

is_numeric("123");     // true
is_numeric("3.14");    // true
is_numeric("-456");    // true

4. 科学記数法

is_numeric("1e10");    // true
is_numeric("1E-5");    // true
is_numeric("2.5e3");   // true

5. 16進数表記

is_numeric("0x1A");    // true
is_numeric("0xFF");    // true

注意すべきポイント

1. 先頭・末尾の空白文字は無視される

is_numeric("  123  ");   // true
is_numeric("\t456\n");   // true

2. 空文字列は数値ではない

is_numeric("");          // false
is_numeric("   ");       // false

3. 数値以外の文字が混在する場合は false

is_numeric("123abc");    // false
is_numeric("abc123");    // false
is_numeric("12.34.56");  // false

4. 特殊な値の判定

is_numeric(null);        // false
is_numeric(true);        // false
is_numeric(false);       // false
is_numeric([]);          // false

実際の開発での活用例

1. フォームバリデーション

function validateAge($age) {
    if (!is_numeric($age)) {
        return "年齢は数値で入力してください";
    }
    
    $age = (int)$age;
    if ($age < 0 || $age > 150) {
        return "年齢は0以上150以下で入力してください";
    }
    
    return true;
}

// 使用例
$userAge = $_POST['age'] ?? '';
$result = validateAge($userAge);
if ($result !== true) {
    echo $result;
}

2. 配列の数値フィルタリング

$mixedArray = ["123", "hello", 456, "3.14", "world", -789];
$numericValues = array_filter($mixedArray, 'is_numeric');

print_r($numericValues);
// 出力: Array([0] => 123, [2] => 456, [3] => 3.14, [5] => -789)

3. データベースの値チェック

function sanitizeNumericInput($value) {
    if (!is_numeric($value)) {
        throw new InvalidArgumentException("数値が必要です");
    }
    
    return is_int($value) ? $value : (float)$value;
}

// 使用例
try {
    $price = sanitizeNumericInput($_POST['price']);
    // データベースに安全に保存
} catch (InvalidArgumentException $e) {
    echo "エラー: " . $e->getMessage();
}

類似関数との比較

is_int() vs is_numeric()

$value = "123";
var_dump(is_int($value));      // false(文字列なので)
var_dump(is_numeric($value));  // true(数値文字列なので)

is_float() vs is_numeric()

$value = "3.14";
var_dump(is_float($value));    // false(文字列なので)
var_dump(is_numeric($value));  // true(数値文字列なので)

ctype_digit() vs is_numeric()

$value = "123";
var_dump(ctype_digit($value)); // true(正の整数文字列)
var_dump(is_numeric($value));  // true

$value = "-123";
var_dump(ctype_digit($value)); // false(負の数は不可)
var_dump(is_numeric($value));  // true(負の数も可)

パフォーマンスの考慮事項

is_numeric()は高速な関数ですが、大量のデータを処理する際は以下のような最適化を検討できます:

// より厳密な整数チェックが必要な場合
function isStrictInteger($value) {
    return is_int($value) || (is_string($value) && ctype_digit($value));
}

// 浮動小数点数を含む数値チェック
function isNumericValue($value) {
    return is_numeric($value) && !is_bool($value);
}

まとめ

is_numeric()関数は、PHPで数値判定を行う際の強力なツールです。この関数を使うことで、ユーザー入力の検証、データの型チェック、配列のフィルタリングなど、様々な場面で安全なプログラムを書くことができます。

重要なポイント:

  • 数値と数値文字列の両方を判定できる
  • 科学記数法や16進数表記も認識する
  • 空白文字は無視される
  • 空文字列や非数値文字列はfalseを返す
  • 他の型判定関数と組み合わせることで、より精密な判定が可能

PHPでの数値処理において、is_numeric()関数は必須の知識です。この記事を参考に、実際のプロジェクトでぜひ活用してみてください。

タイトルとURLをコピーしました