はじめに
PHPの filter_var() は、入力値の検証に使われる便利な関数です。
中でも FILTER_VALIDATE_FLOAT は「小数点を含む数値を検証する」と誤解されやすいフィルタですが、実際にはもっと柔軟に「浮動小数点として解釈可能かどうか」をチェックします。
この記事では、PHP8 上級試験の問題例をベースに、その動作を正確に理解していきます。
目次
🧩 基本構文
filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixedfilter_var() は、指定したフィルタで値を検証します。FILTER_VALIDATE_FLOAT を指定すると、「与えられた値が 浮動小数点として有効か」をチェックし、成功すれば float 型に変換して返します。失敗した場合は false を返します。
🧪 サンプルコード
<?php
declare(strict_types=1);
error_reporting(-1);
$fn = function(mixed $v){
    var_dump($v);
    $r = filter_var($v, FILTER_VALIDATE_FLOAT);
    var_dump($r);
};
$fn(1_000);
$fn('abc');
$fn('-1.234e+4');🧾 実行結果
int(1000)
float(1000)
string(3) "abc"
bool(false)
string(9) "-1.234e+4"
float(-12340
🔍 各結果の意味
| 入力値 | 説明 | 戻り値 | 
|---|---|---|
1_000 | PHP8 では数値リテラルの区切り文字 _ は無視されるため int(1000) になる。float として検証成功。 | float(1000) | 
'abc' | 数値として解釈できないため検証失敗。 | false | 
'-1.234e+4' | 指数表記 の文字列。浮動小数点として有効。 | float(-12340) | 
💡 注意ポイント
「FILTER_VALIDATE_FLOAT は小数点の有無を調べる」と思い込むのは誤りです。実際には、以下のような形式がすべて有効です。
filter_var("1.23", FILTER_VALIDATE_FLOAT);    // OK
filter_var("1e3", FILTER_VALIDATE_FLOAT);     // OK(指数表記)
filter_var("-1.234E+4", FILTER_VALIDATE_FLOAT); // OK
filter_var("abc", FILTER_VALIDATE_FLOAT);     // falseつまり、「浮動小数点表現として妥当か」を確認するフィルタです。
図解:FILTER_VALIDATE_FLOATの動作イメージ
┌─────────────────────────────────────────┐
│ filter_var($v, FILTER_VALIDATE_FLOAT)   │
└─────────────────────────────────────────┘
           │
           ├─ 数値または数値文字列 → floatに変換して返す
           │    例: "1.23" → 1.23
           │        "1e3"  → 1000.0
           │        1000   → 1000.0
           │
           └─ 数値として解釈できない文字列 → false
                 例: "abc" → false🪶 まとめ
| 項目 | 内容 | 
|---|---|
| 関数 | filter_var() | 
| フィルタ | FILTER_VALIDATE_FLOAT | 
| 成功条件 | 値が浮動小数点として有効(例: "1.23", "1e3", "-1.234E+4") | 
| 失敗条件 | 数値に変換できない文字列(例: "abc") | 
| 戻り値 | 成功時:float値、失敗時:false | 
| 試験ポイント | 「小数点検証」ではなく「float検証」である点を理解しておく | 
