PHPでは、 array_filter()とarray_map()は、2つの非常に強力で一般的に使用される配列処理機能です。前者はアレイ内の要素をフィルタリングするために使用され、後者は配列内の各要素を変換するために使用されます。それらだけを使用すると多くの問題が解決できますが、2つを一緒に使用すると、ネストされた配列、オブジェクト配列、複数の処理手順を必要とするビジネスロジックなど、複雑な構造でより効率的にデータを処理できます。
この記事では、実用的な例を使用して、 array_filter()とarray_map()を巧みに組み合わせて、複雑な配列のフィルタリングと変換を実装する方法を示します。
ユーザーの配列があるとします。各ユーザーには、名前、年齢、メールアドレス、ステータスなどの情報が含まれています。目標は次のとおりです。
ステータス「アクティブ」を持つユーザーのみが保持されます。
各ユーザーの名前を資本に変換します。
2つのフィールドのみ:名前とメールボックス。
元の配列の例は次のとおりです。
$users = [
['name' => 'Alice', 'age' => 25, 'email' => 'alice@m66.net', 'status' => 'active'],
['name' => 'Bob', 'age' => 30, 'email' => 'bob@m66.net', 'status' => 'inactive'],
['name' => 'Charlie', 'age' => 22, 'email' => 'charlie@m66.net', 'status' => 'active'],
];
最初にarray_filter()を使用して、アクティブなステータスでユーザーを除外しましょう。
$activeUsers = array_filter($users, function($user) {
return $user['status'] === 'active';
});
このステップが実行された後、 $ ActiveUsersにはAliceとCharlieのみが含まれています。
次に、 Array_map()で名前を大文字にし、気にするフィールドのみを保持します(名前と電子メール):
$transformedUsers = array_map(function($user) {
return [
'name' => strtoupper($user['name']),
'email' => $user['email']
];
}, $activeUsers);
出力結果:
[
['name' => 'ALICE', 'email' => 'alice@m66.net'],
['name' => 'CHARLIE', 'email' => 'charlie@m66.net']
]
コードをより簡潔にしたい場合は、2つの機能をチェーンできます。 array_filter()自体はキーリセットの配列を返しませんが、 array_values()でより適切に機能します。
$processedUsers = array_map(function($user) {
return [
'name' => strtoupper($user['name']),
'email' => $user['email']
];
}, array_values(array_filter($users, function($user) {
return $user['status'] === 'active';
})));
array_filter()とarray_map()を組み合わせることで、複雑な配列を処理することが非常に柔軟になり、「最初にフィルター」の論理的分離を実現できます。この方法は、APIデータリターンの処理、フォームデータのプリプセッシング、ビジネスデータフローなどのシナリオでの使用に非常に適しています。
また、連想配列を扱っている場合、またはキー名を保存する必要がある場合は、 array_keys() 、 array_values()を使用したり、Laravelのコレクションクラスなどのより高度な機能ライブラリを使用して読みやすさと機能を強化することを検討できることを忘れないでください。