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']

ただし、0false も除去されるため、意図しない動作になることがあります。数値の 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 から連番に)