PHP array_filter で条件に合う要素を抽出
array_filter() は、コールバック関数で true を返した要素だけを残す関数です。条件に合う要素を抽出するのに使います。元の配列は変更されず、新しい配列が返されます。
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$evens = array_filter($numbers, function ($n) {
return $n % 2 === 0;
});
print_r($evens);
// [2, 4, 6, 8, 10]array_map() と違い、第 1 引数が配列、第 2 引数がコールバックです。この引数順序の不一致は PHP の歴史的な設計上の問題で、よく混乱を招きます。
コールバックを省略する
コールバックを省略すると、false と評価される値(0, '', null, false, [])が除去されます。空の値を一括で取り除きたいときに便利です。
$values = ['hello', '', 0, null, 'world', false, []];
$filtered = array_filter($values);
print_r($filtered);
// ['hello', 'world']ただし、0 や false も除去されるため、意図しない動作になることがあります。数値の 0 を残したい場合は、明示的にコールバックを書く必要があります。
キーも使って抽出する
第 3 引数に ARRAY_FILTER_USE_KEY を指定するとキーだけが、ARRAY_FILTER_USE_BOTH を指定するとキーと値の両方がコールバックに渡されます。
$data = [
'user_name' => 'Alice',
'user_age' => 25,
'temp_data' => 'xxx',
'user_email' => 'alice@example.com'
];
// user_ で始まるキーだけ抽出
$users = array_filter($data, function ($key) {
return str_starts_with($key, 'user_');
}, ARRAY_FILTER_USE_KEY);
print_r($users);
// ['user_name' => 'Alice', 'user_age' => 25, 'user_email' => ...]キーの再インデックス
array_filter() は元のキーを保持します。通常の配列で連番にしたい場合は array_values() と組み合わせます。
$numbers = [1, 2, 3, 4, 5];
$evens = array_filter($numbers, fn($n) => $n % 2 === 0);
print_r($evens);
// [1 => 2, 3 => 4](キーが飛んでいる)
$evens = array_values($evens);
// [2, 4](0 から連番に)