配列

PHPのarray_filter関数の使い方について解説

PHPのarray_filter関数は、配列から条件に合致する要素だけを抽出するために使用されます。

コールバック関数を指定することで、各要素を評価し、真と判断された値だけを返す処理をシンプルに実現できます。

この記事では、基本的な使い方や活用方法についてご紹介します。

基本的な使い方

array_filter関数の基本

関数の目的と基本書式(arrayfilter($array,$callback))

array_filter関数は、配列の各要素に対してコールバック関数を実行し、その結果が真となる要素だけを抽出するために利用されます。

基本書式は以下のようになります。

arrayfilter($array,$callback)

ここで、\$arrayはフィルタリングを行う対象の配列、\$callbackは各要素に対して適用する関数です。

コールバック関数が返す結果がtrueとなった場合、その要素が新たな配列に含まれる形となります。

シンプルな使用例

無名関数を利用したフィルタリング

無名関数を利用すると、特定の条件に合致する要素だけを簡単に抽出できます。

例えば、配列の中から正の数だけを取得する場合、以下のようなコードを書いて確認できます。

<?php
// 数値の配列を定義
$numbers = [ -3, 5, 0, 8, -1, 4 ];
// 無名関数を使用して正の数のみを抽出
$positiveNumbers = array_filter($numbers, function($num) {
    // 数値が0より大きいかどうかを判定する
    return $num > 0;
});
// 結果を表示
print_r($positiveNumbers);
?>
Array
(
    [1] => 5
    [3] => 8
    [5] => 4
)

このコードでは、無名関数内で\$num > 0の条件を指定し、条件を満たす要素のみが抽出されています。

コールバック引数省略時の動作

コールバック引数を省略した場合、array_filter関数はデフォルトで各要素の真偽値を評価します。

つまり、false0""nullなどの評価が偽となる値は除外されます。

以下のコード例で動作を確認できます。

<?php
// 混合型の配列を定義
$mixedArray = [0, 1, false, 2, '', 3, null, 4];
// コールバックを省略してフィルタリング
$filteredArray = array_filter($mixedArray);
// 結果を表示
print_r($filteredArray);
?>
Array
(
    [1] => 1
    [3] => 2
    [5] => 3
    [7] => 4
)

この例では、偽と評価される値が除去され、真と評価される値のみが配列に残る動作が確認できます。

コールバック関数の設定方法

カスタムコールバックの作成

条件指定の基本パターン

カスタムコールバックを作成することで、より複雑な条件で配列をフィルタリングできます。

以下は、配列の中から偶数のみを抽出する基本的なパターンです。

<?php
// 数値の配列を定義
$numbers = [1, 2, 3, 4, 5, 6];
// 偶数判定のカスタムコールバック関数を定義
$evenFilter = function($num) {
    // 2で割った余りが0かをチェック
    return $num % 2 === 0;
};
// array_filterで偶数のみ抽出
$evenNumbers = array_filter($numbers, $evenFilter);
// 結果を表示
print_r($evenNumbers);
?>
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
)

このコードでは、カスタムコールバックとして定義した無名関数を利用して、偶数だけを抽出する処理を実現しています。

複数条件の適用例

複数の条件を組み合わせてフィルタリングする場合は、コールバック関数内で論理演算子を用いて複数の判定を行います。

次の例では、配列内の正の偶数のみを抽出する方法を示します。

<?php
// 数値の配列を定義
$numbers = [-4, -2, 0, 1, 2, 3, 4, 5, 6];
// 複数条件(正の数かつ偶数)のカスタムコールバック関数を定義
$positiveEvenFilter = function($num) {
    // 正の数で、かつ偶数であるかをチェック
    return ($num > 0) && ($num % 2 === 0);
};
// array_filterで条件を満たす要素を抽出
$positiveEvenNumbers = array_filter($numbers, $positiveEvenFilter);
// 結果を表示
print_r($positiveEvenNumbers);
?>
Array
(
    [4] => 2
    [6] => 4
    [8] => 6
)

この例では、正の数であることと偶数であることの両方を満たす要素だけが抽出されています。

無名関数と名前付き関数の使い分け

無名関数は、用途が単一で外部に再利用する必要がない場合に手軽に利用できます。

一方、名前付き関数は複数箇所で再利用する際に便利です。

以下は名前付き関数を利用した例です。

<?php
// 名前付き関数を定義(数値が奇数かどうかを判定)
function isOdd($num) {
    // 数値が奇数であるかをチェック
    return $num % 2 === 1;
}
$numbers = [1, 2, 3, 4, 5];
// 名前付き関数を利用して奇数のみ抽出
$oddNumbers = array_filter($numbers, 'isOdd');
// 結果を表示
print_r($oddNumbers);
?>
Array
(
    [0] => 1
    [2] => 3
    [4] => 5
)

このコードでは、isOddという名前付き関数を定義し、複数箇所で利用できるため、コードの再利用性が向上します。

応用パターンと実装例

連想配列への適用

キーの維持と再構成

array_filterは連想配列に対しても使用可能です。

連想配列の場合、キーをそのまま保持したままフィルタリングすることができるため、元の構造を保つことができます。

以下のコード例を参照してください。

<?php
// 連想配列を定義(ユーザー名と年齢)
$users = [
    "Alice" => 25,
    "Bob"   => 17,
    "Carol" => 30,
    "Dave"  => 15
];
// 年齢が18歳以上のユーザーのみ抽出するカスタムコールバックを定義
$adultFilter = function($age) {
    return $age >= 18;
};
// array_filterで18歳以上のユーザーを抽出
$adults = array_filter($users, $adultFilter);
// 結果を表示
print_r($adults);
?>
Array
(
    [Alice] => 25
    [Carol] => 30
)

この例では、キーが維持された状態で、年齢の条件に合致するユーザーのみが抽出されています。

多次元配列のフィルタリング

ネスト構造への処理方法

多次元配列の場合、各ネストされた配列に対して個別にarray_filterを適用する方法もあります。

以下は、ユーザー情報を持つ多次元配列から、年齢が20歳以上のユーザーのみを抽出する例です。

<?php
// ユーザー情報を含む多次元配列を定義
$users = [
    ["name" => "Alice", "age" => 25],
    ["name" => "Bob",   "age" => 17],
    ["name" => "Carol", "age" => 30],
    ["name" => "Dave",  "age" => 15]
];
// 各要素内の年齢に対してフィルタリングを実施
$filteredUsers = array_filter($users, function($user) {
    return $user['age'] >= 20;
});
// 結果を表示
print_r($filteredUsers);
?>
Array
(
    [0] => Array
        (
            [name] => Alice
            [age] => 25
        )
    [2] => Array
        (
            [name] => Carol
            [age] => 30
        )
)

このコードでは、各ユーザー情報が格納された連想配列に対して、年齢の条件でフィルタリングを行っています。

注意点とパフォーマンスへの工夫

型の取り扱いとエラー対策

よくあるエラーの原因と対処法

array_filterを使用する際には、対象の配列が正しく初期化されているか、コールバック関数が存在するかなどの確認が重要です。

以下の点に注意してください。

・対象の変数が配列でない場合、予期しない動作やエラーが発生する可能性がある

・コールバック関数内で予期せぬ型の値が渡された場合、エラーが発生する可能性がある

これらのエラーに対しては、事前に変数の型チェックやエラーハンドリングを実装することで対処できます。

例えば、以下のように配列であることをチェックする方法があります。

<?php
// 入力が配列かをチェックする関数
function safeArrayFilter($input, $callback) {
    if (!is_array($input)) {
        // inputが配列でない場合は空配列を返す
        return [];
    }
    return array_filter($input, $callback);
}
// 使用例:数値のフィルタリング
$inputData = "not an array";
$result = safeArrayFilter($inputData, function($value) {
    return $value > 0;
});
// 結果を表示(空配列が返る)
print_r($result);
?>
Array
(
)

この例のように、入力の型を確認して適切な処理を行うことで、エラー発生のリスクを低減できます。

実行速度とメモリ効率の向上策

多くの要素を扱う場合、array_filterのパフォーマンスにも注意が必要です。

以下の点で工夫すると、実行速度とメモリ効率の向上が期待できます。

・コールバック関数内での不要な処理を排除する

・条件が複雑な場合、事前に条件を整理しておく

・大規模な配列の場合、必要に応じて処理を分割する

具体的な例として、フィルタリング処理の中で重い計算を行わないようにする工夫が考えられます。

シンプルな条件判断であれば、PHPの内部最適化も活用されるため、実用上のパフォーマンス改善が期待できます。

必要に応じて、処理結果をキャッシュする方法も検討すると良いでしょう。

まとめ

この記事では、PHPのarray_filter関数の基本操作と実用例、コールバック設定、連想配列および多次元配列への適用、型の取り扱いやパフォーマンス向上を実現する技法について詳しく説明しましたでした。

全体を通して、関数の動作やエラー対策、複数条件の処理方法が理解できる内容となっています。

ぜひ、学んだ内容を実際の開発に取り入れて、新たな挑戦を始めてください。

関連記事

Back to top button
目次へ