PHPにおいて、配列データの操作はプログラム開発の中で最も頻繁に行われる作業の一つと言っても過言ではありません。
特に、大量のデータセットから特定の条件に合致する要素のみを抽出する「フィルタリング」の工程は、アプリケーションの効率や可読性に直結します。
本記事では、PHPの標準関数であるarray_filterに焦点を当て、その基礎的な使い方から、現場で役立つ実戦的な応用テクニックまでを詳しく解説します。
2026年現在のモダンなPHP開発環境においても、この関数を正しく使いこなすことは、クリーンなコードを書くための必須スキルと言えるでしょう。
array_filter関数の基本仕様
array_filterは、配列の各要素をコールバック関数に渡し、その関数がtrueを返した要素のみを保持した新しい配列を返す関数です。
まずは、この関数の基本的なシグネチャを確認しておきましょう。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
第一引数には対象となる配列を、第二引数にはフィルタリング条件を定義するコールバック関数を指定します。
第三引数の$modeは、コールバック関数に渡す引数の種類を制御するためのフラグです。
この関数の最大の特徴は、元の配列を直接変更せず、新しい配列を生成して返すイミュータブルな操作である点にあります。
コールバック関数を省略した場合の挙動
array_filterの第二引数は省略可能であり、省略した場合にはデフォルトの挙動が適用されます。
コールバック関数を指定しない場合、PHPは各要素を論理値として評価し、「空」とみなされる要素をすべて除外します。
具体的には、false、0、0.0、空の文字列、null、空の配列などが削除対象となります。
$data = [0, 1, false, 2, '', 3, null, [4]];
$result = array_filter($data);
print_r($result);
Array
(
[1] => 1
[3] => 2
[5] => 3
[7] => Array
(
[0] => 4
)
)
このように、入力フォームから送信されたデータから不要な空文字やnullを取り除く際などに非常に便利です。
基本的なフィルタリングの実装方法
実際の開発では、特定の数値より大きい要素だけを抽出したり、特定の文字列を含む要素を探したりする場面が多々あります。
ここでは、匿名関数(クロージャ)を使用した標準的なフィルタリング方法を見ていきましょう。
数値によるフィルタリング
例えば、売上データの中から1,000円以上の商品のみを抽出する場合は以下のように記述します。
$prices = [500, 1200, 800, 2500, 300];
$expensiveItems = array_filter($prices, function($price) {
return $price >= 1000;
});
print_r($expensiveItems);
Array
(
[1] => 1200
[3] => 2500
)
この例では、匿名関数が各要素をチェックし、条件を満たすものだけが戻り値の配列に含まれています。
アロー関数による簡潔な記述
PHP 7.4以降で導入されたアロー関数を利用すると、記述をより短縮することが可能です。
スコープ外の変数も自動的にキャプチャできるため、フィルタリングの閾値を動的に変えたい場合に有効です。
$threshold = 1500;
$prices = [500, 1200, 800, 2500, 300];
// アロー関数を使用した簡潔なフィルタリング
$filtered = array_filter($prices, fn($p) => $p > $threshold);
print_r($filtered);
Array
(
[3] => 2500
)
コードの可読性が大幅に向上するため、モダンなPHP開発ではアロー関数の使用が推奨されます。
フラグを使用した高度なフィルタリング
デフォルトの状態では、array_filterのコールバック関数には配列の「値」のみが渡されます。
しかし、要件によっては「キー」に基づいてフィルタリングを行いたいケースや、「キーと値の両方」を参照したいケースがあります。
そのような場合に活用するのが、第三引数のフラグ設定です。
ARRAY_FILTER_USE_KEY の活用
このフラグを指定すると、コールバック関数に「値」ではなく「キー」が渡されるようになります。
$userRoles = [
'admin_user' => '管理者',
'staff_01' => 'スタッフ',
'admin_sub' => '副管理者',
'guest_99' => 'ゲスト'
];
// キーに 'admin' が含まれる要素のみを抽出
$admins = array_filter($userRoles, function($key) {
return str_contains($key, 'admin');
}, ARRAY_FILTER_USE_KEY);
print_r($admins);
Array
(
[admin_user] => 管理者
[admin_sub] => 副管理者
)
ARRAY_FILTER_USE_BOTH の活用
値とキーの両方を条件判定に使いたい場合は、ARRAY_FILTER_USE_BOTHフラグを使用します。
コールバック関数の第一引数に「値」、第二引数に「キー」が渡される点に注意してください。
$settings = [
'timeout' => 30,
'retry' => 5,
'debug' => true,
'cache' => false
];
$filteredSettings = array_filter($settings, function($value, $key) {
// 数値型かつキー名が5文字以上の要素を抽出
return is_int($value) && strlen($key) >= 5;
}, ARRAY_FILTER_USE_BOTH);
print_r($filteredSettings);
Array
(
[timeout] => 30
[retry] => 5
)
実戦で役立つ効率化テクニック
array_filterを使用する上で、避けて通れない「注意点」と「効率化の手法」を解説します。
キーの再振り直し(array_values)
array_filterはフィルタリング後も元の配列のキーを維持します。
数値インデックスの配列をフィルタリングした場合、インデックスが飛び飛びになってしまうため、JSON出力やforループでの処理に不都合が生じることがあります。
これを解決するためには、array_values関数を併用してインデックスを振り直すのが一般的です。
$numbers = [10, 20, 30, 40, 50];
$filtered = array_filter($numbers, fn($n) => $n > 25);
// このままだとキーは [2, 3, 4]
$reindexed = array_values($filtered);
print_r($reindexed);
Array
(
[0] => 30
[1] => 40
[2] => 50
)
多次元配列のフィルタリング
データベースから取得した多次元配列(連想配列の配列)に対しても、array_filterは有効です。
特定のプロパティを持つオブジェクトや、特定のステータスを持つ多次元配列の抽出に役立ちます。
$products = [
['id' => 1, 'name' => 'PC', 'stock' => 5],
['id' => 2, 'name' => 'Mouse', 'stock' => 0],
['id' => 3, 'name' => 'Monitor', 'stock' => 12],
];
// 在庫がある商品だけを抽出
$inStock = array_filter($products, fn($item) => $item['stock'] > 0);
パフォーマンスの考慮
非常に巨大な配列(数万件以上)を扱う場合、array_filterとforeachによる手動フィルタリングのどちらが速いか議論になることがあります。
一般的に、単純なフィルタリングであればarray_filterの方が組み込み関数として最適化されていますが、複雑なロジックを伴う場合はオーバーヘッドが生じる可能性もあります。
しかし、コードの宣言的な記述(「何をしたいか」を記述する)によるメンテナンス性の向上は、微小な速度差よりも優先されるべきケースが大半です。
array_filterの活用シーン比較
他の配列操作関数との使い分けを整理するために、以下の表を参考にしてください。
| 関数名 | 主な目的 | 要素数の変化 |
|---|---|---|
array_filter | 条件に合う要素の抽出 | 減少する可能性がある |
array_map | 全要素の加工・変換 | 変化しない |
array_walk | 全要素に対する参照渡しでの操作 | 変化しない |
array_reduce | 配列を単一の値に集約 | 1つになる |
データの「選別」を行いたいのであれば、迷わずarray_filterを選択しましょう。
よくあるミスとデバッグ方法
開発者が陥りやすいミスの一つに、「0」という値を有効なデータとして扱いたいのに、コールバックを省略して消去してしまうケースがあります。
数値のゼロを保持したい場合は、必ず明示的なコールバック関数を定義してください。
$counts = [0, 5, 10, 0, 15];
// ミス:0が消えてしまう
$wrong = array_filter($counts);
// 正解:nullや空文字だけを除外して0は残す
$correct = array_filter($counts, fn($val) => $val !== null && $val !== '');
このように厳密比較を用いることで、意図しないデータの消失を防ぐことができます。
まとめ
PHPのarray_filter関数は、配列操作における最も基本的かつ強力なツールの一つです。
アロー関数との組み合わせにより、現代のPHPコードはかつてないほど簡潔で読みやすいものになりました。
基本的な値の抽出だけでなく、フラグを用いたキーの利用や、array_valuesによるインデックスの最適化をマスターすることで、実務レベルのデータ処理が格段にスムーズになります。
「空要素の削除」という単純な用途から、複雑なビジネスロジックに基づく「データの選別」まで、シーンに合わせて柔軟に使いこなしていきましょう。
日々の開発において、ループ処理を愚直に書く前に「これはarray_filterで解決できないか?」と考える習慣をつけることが、ワンランク上のエンジニアへの近道です。
