Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】FILTER_CALLBACK定数の使い方

FILTER_CALLBACK定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

FILTER_CALLBACK定数は、PHPのフィルタリング機能において、ユーザー定義のコールバック関数を使って値を処理することを表す定数です。これは、プログラムに入力されたデータを検証したり、整形したりする際に利用されるfilter_var()filter_input()といった関数で使用されます。

この定数を第二引数として指定すると、開発者が独自に定義した関数(コールバック関数と呼ばれます)が、フィルタリング対象のデータに対して実行されます。コールバック関数とは、別の関数に引数として渡され、その関数の中で呼び出される関数のことです。FILTER_CALLBACKを使用する主な目的は、PHPに標準で用意されているフィルタでは対応できないような、より複雑なカスタムバリデーションや、独自のサニタイズ(無害化)処理を実現することにあります。

例えば、特定のパターンに一致する文字列のみを許可したり、複数の条件を組み合わせて数値を検証したりする場合に役立ちます。コールバック関数は、filter_var()関数の第三引数であるoptions配列に、'options' => 'コールバック関数名'といった形式で指定します。このコールバック関数は、フィルタリング対象の値を受け取り、処理後の値を返すか、検証に失敗した場合はfalseを返す必要があります。

このように、FILTER_CALLBACK定数を利用することで、開発者はPHPの標準フィルタリング機能を大きく拡張し、アプリケーションの要件に合わせた非常に柔軟で強力なデータ処理を行うことが可能になります。これは、外部からの入力データを安全かつ正確に扱うための重要な手段の一つです。

構文(syntax)

1<?php
2
3$value_to_filter = "some string data";
4
5// カスタムフィルタリングロジックを実装したコールバック関数を定義
6$custom_filter_callback = function($value) {
7    // 例: 文字列が 'data' を含む場合のみ、それを大文字にして返す
8    if (strpos($value, 'data') !== false) {
9        return strtoupper($value);
10    }
11    return false; // 条件を満たさない場合はフィルタリング失敗
12};
13
14// filter_var 関数で FILTER_CALLBACK 定数を使用してカスタムフィルタリングを適用
15$filtered_result = filter_var($value_to_filter, FILTER_CALLBACK, ['options' => $custom_filter_callback]);
16
17?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

FILTER_CALLBACKでパラメータ付きコールバックを適用する

1<?php
2
3/**
4 * FILTER_CALLBACK 定数を使用して、ユーザー定義のコールバック関数で値をフィルタリングするサンプルです。
5 * この例では、filter_var() 関数とクロージャの `use` キーワードを組み合わせ、
6 * コールバック関数に外部のパラメータを渡す方法を示します。
7 *
8 * FILTER_CALLBACK 定数は、filter_var() や filter_input() などのフィルタリング関数に
9 * ユーザー定義のコールバック関数を適用する際に使用される定数です。
10 */
11function demonstrateFilterCallbackWithParameters(): void
12{
13    // フィルタリング対象となる文字列値
14    $testString1 = "Hello PHP 8 World";
15    // コールバック関数に渡す追加のパラメータ(最小の文字長)
16    $minLength = 10;
17
18    echo "--- フィルタリング例 1 ---\n";
19    echo "元の文字列: '{$testString1}'\n";
20    echo "最小文字長: {$minLength}\n";
21
22    // filter_var() を使用し、FILTER_CALLBACK を指定してカスタムコールバック関数を適用
23    // 'options' キーには、フィルタリングロジックを持つコールバック関数を配列で指定します。
24    // 無名関数(クロージャ)と `use` キーワードを使うことで、外部の変数 ($minLength) を
25    // コールバック関数内で利用できます。これが「parameters」を渡す一般的な方法です。
26    $filteredResult1 = filter_var(
27        $testString1,
28        FILTER_CALLBACK,
29        [
30            'options' => function (string $inputString) use ($minLength): ?string {
31                // コールバック関数は、フィルタリング対象の値 ($inputString) を引数として受け取ります。
32                // $minLength は `use` キーワードで外部からキャプチャしたパラメータです。
33                if (strlen($inputString) >= $minLength) {
34                    // 条件を満たす場合、値をそのまま返します。
35                    return $inputString;
36                }
37                // 条件を満たさない場合、フィルタリング失敗として null を返します。
38                // null はフィルタリング関数によって 'false' として解釈されることがあります。
39                return null;
40            }
41        ]
42    );
43
44    // フィルタリング結果の表示
45    if ($filteredResult1 !== null) {
46        echo "フィルタリング後の結果: '{$filteredResult1}'\n";
47        echo "結果: 文字列の長さが {$minLength} 以上であるため、フィルタリングを通過しました。\n";
48    } else {
49        echo "フィルタリング後の結果: (除外されました)\n";
50        echo "結果: 文字列の長さが {$minLength} 未満であるため、フィルタリングによって除外されました。\n";
51    }
52
53    echo "\n";
54
55    // 別の値でフィルタリングを試す
56    $testString2 = "PHP";
57
58    echo "--- フィルタリング例 2 ---\n";
59    echo "元の文字列: '{$testString2}'\n";
60    echo "最小文字長: {$minLength}\n";
61
62    // 同じコールバック関数とパラメータで再利用
63    $filteredResult2 = filter_var(
64        $testString2,
65        FILTER_CALLBACK,
66        [
67            'options' => function (string $inputString) use ($minLength): ?string {
68                if (strlen($inputString) >= $minLength) {
69                    return $inputString;
70                }
71                return null;
72            }
73        ]
74    );
75
76    // フィルタリング結果の表示
77    if ($filteredResult2 !== null) {
78        echo "フィルタリング後の結果: '{$filteredResult2}'\n";
79        echo "結果: 文字列の長さが {$minLength} 以上であるため、フィルタリングを通過しました。\n";
80    } else {
81        echo "フィルタリング後の結果: (除外されました)\n";
82        echo "結果: 文字列の長さが {$minLength} 未満であるため、フィルタリングによって除外されました。\n";
83    }
84}
85
86// 関数を実行してサンプルコードの動作を確認
87demonstrateFilterCallbackWithParameters();

PHPのFILTER_CALLBACK定数は、filter_var()などのフィルタリング関数で、開発者自身が定義したルールに基づいて値をチェックしたり変換したりしたい場合に使用する定数です。この定数を指定することで、PHPが提供する標準のフィルタリング機能だけでなく、独自のコールバック関数を適用できるようになります。

サンプルコードでは、文字列の長さを基準にフィルタリングする例を示しています。特に注目すべきは、コールバック関数に外部のパラメータを渡す方法です。通常、コールバック関数はフィルタリング対象の値のみを引数として受け取りますが、無名関数(クロージャ)とuseキーワードを組み合わせることで、$minLengthのような外部の変数をコールバック関数内で利用できます。これが、コールバック関数に「パラメータを渡す」仕組みです。

コールバック関数は、フィルタリング対象の値を引数として受け取ります。この関数がフィルタリング条件を満たすと判断した場合は、処理後の値(または元の値)を戻り値として返します。一方、条件を満たさない場合はnullを返します。filter_var()のような関数は、コールバック関数がnullを返した場合、その値をフィルタリングから除外されたものとして扱います。このように、FILTER_CALLBACKは非常に柔軟なフィルタリングロジックを実装するために活用できます。

PHPのFILTER_CALLBACKを使用する際は、コールバック関数が値をフィルタリングに通す場合はその値を、通さない場合はnullを返すようにしてください。nullを返すと、filter_var()関数の結果もnullとなり、フィルタリングで除外されたと判断されます。外部の変数をコールバック関数内で利用したい場合は、サンプルコードのように無名関数(クロージャ)とuseキーワードを使うのが標準的な方法です。これにより、コールバックに柔軟な条件を渡せます。filter_var()FILTER_CALLBACK指定時、コールバックの戻り値を直接返すため、nullfalseの区別に留意し、常に意図した結果となるよう戻り値の型と値を明確にしてください。

PHP array_filterで偽値を除去する

1<?php
2
3/**
4 * PHP 8 の array_filter 関数をコールバックなしで使用するサンプル。
5 *
6 * この関数は、入力された配列から「偽値 (falsy values)」と見なされる要素を削除します。
7 * array_filter をコールバック関数なしで呼び出すと、内部的に各要素がブール値に変換され、
8 * その結果が false となる要素 (例: 0, null, false, 空文字列 "", 空配列 [], 文字列 "0") は
9 * フィルタリングによって削除されます。
10 *
11 * 提供されたリファレンス情報にある FILTER_CALLBACK 定数は、filter_var() などの関数で
12 * カスタムフィルタリングロジック(コールバック関数)を指定するために使用されるものであり、
13 * array_filter() のコールバックなしの動作とは直接関係ありません。
14 * このサンプルは「php array_filter without callback」というキーワードに焦点を当てています。
15 *
16 * @param array $data フィルタリングする元の配列
17 * @return array フィルタリングされた配列
18 */
19function filterFalsyValues(array $data): array
20{
21    // array_filter をコールバック関数なしで呼び出す。
22    // この場合、各要素がブール値として評価され、'false' と評価される要素が自動的に削除される。
23    // 例: 0, null, false, "", [], "0" などが削除対象となる。
24    $filteredArray = array_filter($data);
25
26    return $filteredArray;
27}
28
29// サンプルデータの準備
30$inputArray = [
31    1,          // 整数1は真値 (true)
32    0,          // 整数0は偽値 (false)
33    'hello',    // 空でない文字列は真値
34    '',         // 空文字列は偽値
35    null,       // nullは偽値
36    false,      // falseは偽値
37    true,       // trueは真値
38    [],         // 空配列は偽値
39    ['a'],      // 空でない配列は真値
40    '0',        // 文字列"0"はブールキャスト時に偽値
41    ' ',        // スペースを含む文字列は真値
42    'false',    // 文字列"false"は空でないため真値
43    -1,         // 負の整数は真値
44    0.0,        // 浮動小数点数0.0は偽値
45    0.1,        // 浮動小数点数0.1は真値
46];
47
48// 関数を実行し、フィルタリングされた配列を取得
49$resultArray = filterFalsyValues($inputArray);
50
51// 結果を出力して確認
52echo "--- 元の配列 ---\n";
53print_r($inputArray);
54
55echo "\n--- フィルタリングされた配列 (偽値が削除済み) ---\n";
56print_r($resultArray);
57

このサンプルコードは、PHP 8 の array_filter 関数をコールバック関数なしで使用する方法を示しています。array_filter は通常、配列の要素をフィルタリングする際に、各要素を評価するためのコールバック関数を指定しますが、コールバック関数を省略して呼び出すと特別な動作をします。

コールバック関数を指定しない場合、array_filter は配列の各要素を「真偽値(boolean)」として評価します。その結果、「偽(false)」と評価される要素(いわゆる「偽値」)は、フィルタリングによって自動的に配列から削除されます。例えば、整数 0null、論理値 false、空文字列 ""、空配列 []、そして文字列 "0" などが偽値と見なされます。

この filterFalsyValues 関数は、引数として渡された $data 配列からこれらの偽値を効率的に取り除きます。戻り値として、偽値が削除された新しい配列を返します。これにより、不要な要素を含まない、より整理された配列を得ることができます。システム開発において、入力データのクリーニングや不要な情報の除去などに役立つ基本的なテクニックです。

array_filter関数をコールバックなしで使う場合、PHPは配列の各要素を自動的にブール値へ変換し、falseと評価される要素(偽値)を削除します。特に、数値の0、空文字列""nullfalse、空配列[]、そして**文字列の"0"**が偽値として削除される点に注意が必要です。文字列の"false"" "(スペース)は空ではないため、真値として扱われ残ります。

提供されたFILTER_CALLBACK定数は、filter_var()などの関数でカスタムフィルタリングロジックを指定するためのものであり、array_filter()のコールバックなしの動作とは直接関係ありません。これらのフィルタリング挙動を正しく理解せず使用すると、意図せず重要なデータが削除される可能性があるため、注意して利用してください。

関連コンテンツ