【PHP8.x】filter_var_array関数の使い方
filter_var_array関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
filter_var_array関数は、配列に含まれる複数の値を、指定したルールに基づいて一度にフィルタリングまたはサニタイズ(無害化)する処理を実行する関数です。主に、ウェブフォームから送信された$_GETや$_POSTのような複数の入力データをまとめて検証・整形する際に使用されます。この関数は、第1引数にフィルタを適用したいデータを持つ配列を、第2引数に各データに対するフィルタの定義を記述した配列を渡します。第2引数の定義配列では、キーごとに入力値が整数であるか検証するFILTER_VALIDATE_INTや、不正な文字を取り除くFILTER_SANITIZE_STRINGといったフィルタの種類を指定できます。さらに、フィルタにオプションを追加して、例えば数値の範囲を制限することも可能です。処理後、関数はフィルタリングされた結果を新しい配列として返します。検証に失敗した要素はfalseに、入力データに存在しなかったキーに対応する要素はnullになります。単一の値を処理するfilter_var関数と異なり、複数の値を効率的に一括処理できる点が特徴です。
構文(syntax)
1filter_var_array( 2 array $配列, 3 array|int $フィルタ定義, 4 bool $キーが存在しない場合にNULLを追加するか = true 5): 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で複数配列を検証・無害化する
1<?php 2 3/** 4 * filter_var_array() を使用して、複数の入力値を一度に検証・無害化するサンプルです。 5 * Webフォームから受け取ったデータなど、配列形式のデータをまとめて処理する場合に便利です。 6 */ 7function processUserData(): void 8{ 9 // 1. フィルタリング対象となる入力データの配列を定義します。 10 // 通常、これは $_POST や $_GET などのスーパーグローバル変数になります。 11 $userInput = [ 12 'name' => '<b>Taro Yamada</b>', // サニタイズ(無害化)が必要なHTMLタグを含む名前 13 'age' => '25', // 検証が必要な年齢(文字列型) 14 'email' => 'invalid-email', // 不正な形式のメールアドレス 15 'website' => 'https://example.com', // 正しい形式のURL 16 // 'country' キーは入力データに存在しない 17 ]; 18 19 // 2. 各入力キーに対して適用するフィルタのルールを配列で定義します。 20 $filterRules = [ 21 // 'name' はHTMLタグを除去して無害化します (FILTER_SANITIZE_STRING は非推奨のため代替を使用) 22 'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS, 23 24 // 'age' は整数であるか検証し、さらにオプションで有効な範囲を指定します。 25 'age' => [ 26 'filter' => FILTER_VALIDATE_INT, 27 'options' => [ 28 'min_range' => 1, // 最小値は1 29 'max_range' => 120 // 最大値は120 30 ] 31 ], 32 33 // 'email' はメールアドレスとして有効な形式か検証します。 34 'email' => FILTER_VALIDATE_EMAIL, 35 36 // 'website' はURLとして有効な形式か検証します。 37 'website' => FILTER_VALIDATE_URL, 38 39 // 'country' は入力データに存在しませんが、フィルタは定義されています。 40 'country' => FILTER_SANITIZE_SPECIAL_CHARS, 41 ]; 42 43 // 3. filter_var_array() を実行して、配列全体をフィルタリングします。 44 // 第3引数 $add_empty (デフォルトはtrue) により、 45 // 元の配列に存在しないキー ('country') の結果も null として含まれます。 46 $processedData = filter_var_array($userInput, $filterRules); 47 48 // 4. フィルタリング後の結果を出力します。 49 // - 検証に成功した値は、型が変換されたり('age')、そのままの値('website')になります。 50 // - サニタイズされた値は、無害化された文字列('name')になります。 51 // - 検証に失敗した値('email')は false になります。 52 // - 元のデータに存在しなかったキー('country')は null になります。 53 var_dump($processedData); 54} 55 56// 関数を実行 57processUserData(); 58 59/* 60--- 期待される出力 --- 61array(5) { 62 ["name"]=> 63 string(31) "<b>Taro Yamada</b>" 64 ["age"]=> 65 int(25) 66 ["email"]=> 67 bool(false) 68 ["website"]=> 69 string(18) "https://example.com" 70 ["country"]=> 71 NULL 72} 73*/
PHPのfilter_var_array関数は、複数の入力値を一度に検証(バリデーション)したり、無害化(サニタイズ)したりするための便利な機能です。Webフォームから受け取ったデータなど、配列形式のデータをまとめて安全に処理したい場合に利用します。
この関数は、最初の引数$arrayでフィルタリングしたい入力データ(例:$_POSTや$_GET)の配列を受け取ります。次に、二番目の引数$optionsとして、各入力キーにどのようなフィルターを適用するかを定義したルール配列を指定します。たとえば、メールアドレスの検証や、HTMLタグの除去などが設定可能です。オプションの三番目の引数$add_emptyがtrueの場合、元の入力配列に存在しないキーに対しても結果が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として結果に含まれることを理解しておきましょう。フィルタのオプションは配列で細かく指定できるため、条件に応じた柔軟な検証が可能です。