PHP開発では、アレイから特定の条件を満たす要素を除外する必要があることがよくあります。最も一般的な方法の1つは、フィルタリング用の条件付きステートメントを備えたForeachループを使用することです。ただし、PHP標準ライブラリは、この要件のために設計された、より簡潔な関数-Array_Filter()も提供します。それから質問は次のとおりです。
ユーザーリストの配列があり、18歳以上のユーザーを除外したいとします。
$users = [
['name' => 'Alice', 'age' => 22],
['name' => 'Bob', 'age' => 17],
['name' => 'Charlie', 'age' => 30],
];
$adults = [];
foreach ($users as $user) {
if ($user['age'] > 18) {
$adults[] = $user;
}
}
$users = [
['name' => 'Alice', 'age' => 22],
['name' => 'Bob', 'age' => 17],
['name' => 'Charlie', 'age' => 30],
];
$adults = array_filter($users, function($user) {
return $user['age'] > 18;
});
コードの読みやすさに関しては、特にロジックが単純な場合は、 array_filter()がよりコンパクトでクリアです。
単純なテストスクリプトを使用して、2つのパフォーマンスの違いを大量のデータと比較しましょう。
$users = [];
for ($i = 0; $i < 100000; $i++) {
$users[] = ['name' => "User$i", 'age' => rand(10, 50)];
}
// 使用 foreach
$start = microtime(true);
$adults1 = [];
foreach ($users as $user) {
if ($user['age'] > 18) {
$adults1[] = $user;
}
}
$time1 = microtime(true) - $start;
// 使用 array_filter
$start = microtime(true);
$adults2 = array_filter($users, function($user) {
return $user['age'] > 18;
});
$time2 = microtime(true) - $start;
echo "foreach 時間がかかる: {$time1} 2番\n";
echo "array_filter 時間がかかる: {$time2} 2番\n";
foreach 時間がかかる: 0.025 2番
array_filter 時間がかかる: 0.027 2番
ご覧のとおり、パフォーマンスの違いは最小限であり、場合によっては、 Array_Filter()も基本的に内部でループを使用し、関数呼び出しのオーバーヘッドを含むため、 Eachの場合でも少し速くなります。
array_filter()が使用される推奨シナリオ:
条件は単純で、コードはより明確です。
機能スタイルでコードを書きたい。
データ処理チェーンは、他の配列関数( array_map()など)で使用する必要があります。
推奨されるシナリオのために:
より高いパフォーマンスと究極の最適化が必要です。
条件付きロジックは複雑であるか、ループの中断が必要です。
元の配列(参照割り当てなど)を実行するには、追加の操作が必要です。
場合によっては、 foreachはわずかに優れている場合がありますが、 Array_filter()は、特にコードの読みやすさと保守性を追求する場合、よりエレガントなソリューションを提供します。パフォーマンスに関しては、2つの違いは最小限であり、選択は「効率」を盲目的に追求するのではなく、実際のシナリオに基づいている必要があります。
コードを理解して維持しやすくする場合は、 array_filter()を試してみてください。
関連タグ:
array_filter