【PHP8.x】filter_var_array関数の使い方

作成日: 更新日:

filter_var_array関数は、配列に含まれる複数の値を、指定したルールに基づいて一度にフィルタリングまたはサニタイズ(無害化)する処理を実行する関数です。主に、ウェブフォームから送信された$_GET$_POSTのような複数の入力データをまとめて検証・整形する際に使用されます。この関数は、第1引数にフィルタを適用したいデータを持つ配列を、第2引数に各データに対するフィルタの定義を記述した配列を渡します。第2引数の定義配列では、キーごとに入力値が整数であるか検証するFILTER_VALIDATE_INTや、不正な文字を取り除くFILTER_SANITIZE_STRINGといったフィルタの種類を指定できます。さらに、フィルタにオプションを追加して、例えば数値の範囲を制限することも可能です。処理後、関数はフィルタリングされた結果を新しい配列として返します。検証に失敗した要素はfalseに、入力データに存在しなかったキーに対応する要素はnullになります。単一の値を処理するfilter_var関数と異なり、複数の値を効率的に一括処理できる点が特徴です。

基本的な使い方

構文(syntax)

filter_var_array(
    array $配列,
    array|int $フィルタ定義,
    bool $キーが存在しない場合にNULLを追加するか = true
): array|false|null

引数(parameters)

array $array, array|int $options = 516, bool $add_empty = true

  • array $array: フィルタリングする値の配列
  • array|int $options = 516: 適用するフィルタのオプションを指定する配列またはフラグ。デフォルトは FILTER_DEFAULT (FILTER_UNSAFE_RAW)。
  • bool $add_empty = true: 空の値をフィルタリング結果に含めるかどうかを指定するブール値。true の場合、空の値も結果に含まれます。

戻り値(return)

array|false|null

filter_var_array関数は、指定された変数配列に対してフィルタリング処理を実行し、その結果を配列またはfalseで返します。フィルタリングに失敗した場合、または入力にnullが含まれていた場合はnullが返されます。

サンプルコード

PHP: filter_var_arrayで複数配列を検証・無害化する

<?php

/**
 * filter_var_array() を使用して、複数の入力値を一度に検証・無害化するサンプルです。
 * Webフォームから受け取ったデータなど、配列形式のデータをまとめて処理する場合に便利です。
 */
function processUserData(): void
{
    // 1. フィルタリング対象となる入力データの配列を定義します。
    // 通常、これは $_POST や $_GET などのスーパーグローバル変数になります。
    $userInput = [
        'name'    => '<b>Taro Yamada</b>', // サニタイズ(無害化)が必要なHTMLタグを含む名前
        'age'     => '25',                // 検証が必要な年齢(文字列型)
        'email'   => 'invalid-email',     // 不正な形式のメールアドレス
        'website' => 'https://example.com', // 正しい形式のURL
        // 'country' キーは入力データに存在しない
    ];

    // 2. 各入力キーに対して適用するフィルタのルールを配列で定義します。
    $filterRules = [
        // 'name' はHTMLタグを除去して無害化します (FILTER_SANITIZE_STRING は非推奨のため代替を使用)
        'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
        
        // 'age' は整数であるか検証し、さらにオプションで有効な範囲を指定します。
        'age' => [
            'filter'  => FILTER_VALIDATE_INT,
            'options' => [
                'min_range' => 1,  // 最小値は1
                'max_range' => 120 // 最大値は120
            ]
        ],
        
        // 'email' はメールアドレスとして有効な形式か検証します。
        'email' => FILTER_VALIDATE_EMAIL,
        
        // 'website' はURLとして有効な形式か検証します。
        'website' => FILTER_VALIDATE_URL,

        // 'country' は入力データに存在しませんが、フィルタは定義されています。
        'country' => FILTER_SANITIZE_SPECIAL_CHARS,
    ];

    // 3. filter_var_array() を実行して、配列全体をフィルタリングします。
    // 第3引数 $add_empty (デフォルトはtrue) により、
    // 元の配列に存在しないキー ('country') の結果も null として含まれます。
    $processedData = filter_var_array($userInput, $filterRules);

    // 4. フィルタリング後の結果を出力します。
    // - 検証に成功した値は、型が変換されたり('age')、そのままの値('website')になります。
    // - サニタイズされた値は、無害化された文字列('name')になります。
    // - 検証に失敗した値('email')は false になります。
    // - 元のデータに存在しなかったキー('country')は null になります。
    var_dump($processedData);
}

// 関数を実行
processUserData();

/*
--- 期待される出力 ---
array(5) {
  ["name"]=>
  string(31) "&lt;b&gt;Taro Yamada&lt;/b&gt;"
  ["age"]=>
  int(25)
  ["email"]=>
  bool(false)
  ["website"]=>
  string(18) "https://example.com"
  ["country"]=>
  NULL
}
*/

PHPのfilter_var_array関数は、複数の入力値を一度に検証(バリデーション)したり、無害化(サニタイズ)したりするための便利な機能です。Webフォームから受け取ったデータなど、配列形式のデータをまとめて安全に処理したい場合に利用します。

この関数は、最初の引数$arrayでフィルタリングしたい入力データ(例:$_POST$_GET)の配列を受け取ります。次に、二番目の引数$optionsとして、各入力キーにどのようなフィルターを適用するかを定義したルール配列を指定します。たとえば、メールアドレスの検証や、HTMLタグの除去などが設定可能です。オプションの三番目の引数$add_emptytrueの場合、元の入力配列に存在しないキーに対しても結果がnullとして含まれます。

サンプルコードでは、$userInputという仮想の入力データに対して、$filterRulesで定義されたルールを適用しています。nameはHTMLタグが除去され、ageは整数として検証・変換されます。不正な形式のemailは検証に失敗してfalseとなり、正しいwebsiteはそのままの値が返されます。また、入力データに存在しないcountryキーはnullとして結果に含まれています。

filter_var_arrayは、フィルタリング後の結果を連想配列として返します。検証に成功した値は、適切な型に変換されたり、そのままの値で返されます。検証に失敗した値はfalseとなり、無害化された値は処理済みの文字列となります。この関数により、開発者は入力データを安全かつ効率的に処理できるようになります。

filter_var_arrayはウェブフォームなどのユーザー入力データをまとめて検証・無害化する際に非常に有効な関数です。注意点として、フィルタリング結果は入力キーごとに成功時は適切な値や型変換後の値、検証失敗時はfalse、入力データに存在しないキーはnullとなるため、戻り値の各要素を必ず厳密に確認する処理が必要です。

特にFILTER_SANITIZE_STRINGは非推奨であるため、サンプルコードのようにFILTER_SANITIZE_FULL_SPECIAL_CHARSなどの代替フィルタを利用してください。また、フィルタ定義に存在しない入力キーの処理は、第3引数$add_empty(デフォルトtrue)によってnullとして結果に含まれることを理解しておきましょう。フィルタのオプションは配列で細かく指定できるため、条件に応じた柔軟な検証が可能です。

【PHP8.x】filter_var_array関数の使い方 | いっしー@Webエンジニア