定義と使用方法
- PHPバージョン
- 4.0.6+
array_filter()関数は、コールバック関数を使用して配列の要素をフィルタリングします。
この関数を使用すると、配列の要素の中から必要な値だけを簡単にフィルタリングすることができます。
条件をコールバック関数として記述すると、その条件を満たす要素だけが新しい配列として返されます。
特徴
- フィルタリングの条件はコールバック関数内で適用します。
- 条件を満たす場合はtrueを、満たさない場合はfalseを返すように記述する必要があります。 - 元の配列はそのまま保持され、条件を満たす要素だけで構成された新しい配列が返されます。
- このとき、フィルタリングされた要素は、フィルタリング前の配列キー(インデックス)を保持します。
基本の例
array_filter()関数を使用して、配列の要素の中から偶数だけをフィルタリングし、フィルタリングされた配列として返す例です。
// フィルタリングする配列
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 開発者が定義したコールバック関数
function isEven($value) {
return $value % 2 == 0; // 偶数の場合はtrueを返す
}
// フィルタリングされた配列として返す
$evenNumbers = array_filter($numbers, 'isEven');
print_r($evenNumbers);
/*
出力:元の配列のキー(インデックス)をそのまま保持
Array
(
[1] => 2
[3] => 4
[5] => 6
[7] => 8
[9] => 10
)
*/
構文
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
引数
$array |
必須。フィルタリングする配列です。 |
|---|---|
$callback |
オプション。配列の各要素を処理するコールバック関数です。コールバック関数は配列の要素を引数として受け取り、結果としてtrueまたはfalseを返します。trueを返すとその要素はフィルタリングされた配列に含まれ、falseを返すと含まれません。コールバック関数を指定しない場合、配列のすべての空の要素が削除されます。PHP 8.0.0以降では、コールバック関数を指定しないとE_WARNING警告が発生します。 |
$mode |
オプション。条件関数を呼び出す際に渡すフラグで、ARRAY_FILTER_USE_KEYまたはARRAY_FILTER_USE_BOTHのいずれかの定数を使用できます。ARRAY_FILTER_USE_KEYを使用すると、コールバック関数には配列のキーだけが渡されます。これは連想配列でキーを基にフィルタリングを行いたい場合に便利です。ARRAY_FILTER_USE_BOTHを使用すると、コールバック関数には配列の値とキーの両方が渡されます。これにより、値とキーの両方を活用してフィルタリングを行うことができます。デフォルトは0で、値のみがコールバック関数に渡されます。 |
戻り値
フィルタリングされた配列です。このとき、フィルタリングされた要素はフィルタリング前の配列キー(インデックス)を保持します。
コールバック関数の動作原理
array_filter()関数は、与えられた配列の要素を開発者が定義したコールバック関数を使用して希望する条件に従ってフィルタリングし、条件を満たす要素だけで構成されたフィルタリング済みの配列として返す関数です。
array_filter()関数のコールバック関数は、配列をフィルタリングするために使用されます。このコールバック関数は、与えられた配列の各要素に対して呼び出され、その結果に応じて要素がフィルタリングされるかどうかが決まります。以下は、array_filter()関数のコールバック関数が呼び出される過程を順序に沿って説明したものです。
array_filter()関数で使用するコールバック関数の構造
/**
* コールバック関数
*
* @param mixed $element 配列の各要素
* @return bool フィルタリング条件を満たす場合はtrue、満たさない場合はfalseを返す
*
* 名前付き関数(ユーザー定義関数)や無名関数などで使用できます。
*/
/* 名前付き関数をコールバック関数として使用する場合 */
function callback($element) { // 名前付き関数の定義
// フィルタリングするロジック:フィルタリングされた結果を返す必要があります。
}
array_filter($array, 'callback'); // 定義した名前付き関数名を文字列として引数に直接渡す
/* 無名関数をコールバック関数として使用する場合 */
array_filter($array, function($element) {
// フィルタリングするロジック:フィルタリングされた結果を返す必要があります。
});
array_filter()関数の動作手順です。
array_filter()関数を呼び出す際、最初の引数としてフィルタリングする配列を渡します。- 2番目の引数としてコールバック関数を渡します。このコールバック関数は配列の各要素に対して呼び出されます。
array_filter()関数は、フィルタリングする配列の最初の要素を選択し、この要素をコールバック関数の引数($element)として渡します。- コールバック関数が呼び出され、渡された要素はコールバック関数内で使用できます。このコールバック関数内で必要な条件を適用し、
returnキーワードを使用して、その要素がフィルタリング条件を満たすかどうかを判断します。 - コールバック関数が
trueを返すと、現在の要素はフィルタリングされた配列に含まれます。falseを返すと、現在の要素はフィルタリングされた配列に含まれません。 array_filter()関数は次の配列要素を選択し、このプロセスを繰り返します。- すべての配列要素に対するコールバック関数の呼び出しが完了すると、
array_filter()関数はフィルタリングされた結果を含む新しい配列を返します。 - 返された配列には、コールバック関数で
trueを返した要素のみが含まれます。
このようにして、array_filter()関数のコールバック関数は、与えられた配列をフィルタリングし、フィルタリングされた結果を返します。コールバック関数は開発者が定義した条件に基づいてフィルタリングを行うため、さまざまなフィルタリング処理を実行することが可能です。
注意点
元の配列のインデックスの保持
array_filter()関数は、フィルタリングされた結果を新しい配列として返す際に、元の配列のキー(インデックス)をそのまま保持します。そのため、フィルタリングされた配列のキー(インデックス)は元の配列と同じになります。
以下の例は、1から10までの数字で構成された配列をarray_filter()関数で偶数のみフィルタリングする例です。
array_filter()関数は、フィルタリングされた結果を新しい配列として返す際に、元の配列のキー(インデックス)をそのまま保持します。
// フィルタリングする配列
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 開発者が定義したコールバック関数
function isEven($value) {
return $value % 2 == 0; // 偶数の場合はtrueを返す
}
// フィルタリングされた配列として返す
$evenNumbers = array_filter($numbers, 'isEven');
print_r($evenNumbers);
/*
出力:元の配列のキー(インデックス)をそのまま保持
Array
(
[1] => 2
[3] => 4
[5] => 6
[7] => 8
[9] => 10
)
*/
// 注意:フィルタリングされた配列でのインデックスの扱い
var_dump($evenNumbers[0]); // null
このコードで注意すべき点は、フィルタリングされた配列である$evenNumbersは、元の配列$numbersから偶数のみを抽出して生成されますが、最初の要素が0から始まるキー(インデックス)を持っていないことです。フィルタリングされた配列のキー(インデックス)は元の配列と同じであるため、$evenNumbers[0]で最初の要素にアクセスすると、期待した結果にならず、この場合はnullが返されます。
コールバック関数を指定しなかった場合
PHP 8.0.0以降では、array_filter()関数に2番目の引数であるコールバック関数を指定しないと、E_WARNING警告が発生します。
$data = ['apple', '', 'banana', null, 'cherry'];
// 空の値を削除
$filteredData = array_filter($data); // コールバック関数を指定しなかった場合
// 結果を出力
print_r($filteredData);
さまざまな活用例
array_filter()関数はさまざまな配列フィルタリング処理に使用でき、以下はその一部の例です。
特定の値で始まる要素のみをフィルタリング
array_filter()関数を使用すると、特定の値で始まる要素のみをフィルタリングできます。
以下は、"a"で始まる文字列のみで構成された新しい配列を作成する例です。
$array = ["apple", "banana", "cat", "dog", "elephant"];
$stringsStartingWithA = array_filter($array, function ($string) {
return $string[0] == "a";
});
print_r($stringsStartingWithA);
/*
出力:
Array
(
[0] => apple
)
*/
空の値を削除
列の空の値を削除する際に、array_filter()関数とempty()関数を組み合わせて使用することは非常に効果的です。これにより、配列を整理して空の値を簡単に削除できます。以下の例で説明します。
$data = ['apple', '', 'banana', null, 'cherry'];
// 空の値を削除するコールバック関数を指定
$filteredData = array_filter($data, function ($value) {
return !empty($value);
});
// 結果を出力
print_r($filteredData);
/*
出力:
Array
(
[0] => apple
[2] => banana
[4] => cherry
)
*/
連想配列で特定の条件を満たす項目をフィルタリング
array_filter()関数で連想配列の値を基準にフィルタリングする例です。array_filter()関数は主に値を基準にフィルタリングする際に使用されます。キーと値の両方を考慮する必要がある場合は、別の方法を検討する方が適切です。
$scores = [
'Alice' => 85,
'Bob' => 92,
'Carol' => 78,
'David' => 95
];
// 90点以上の学生をフィルタリング
$topScorers = array_filter($scores, function ($value) {
return $value >= 90;
});
// 結果を出力
print_r($topScorers);
/*
出力:
Array
(
[Bob] => 92
[David] => 95
)
*/