In der PHP -Entwicklung müssen wir häufig Elemente herausfiltern, die bestimmte Bedingungen von Arrays erfüllen. Eine der häufigsten Möglichkeiten ist die Verwendung einer Foreach -Schleife mit bedingten Aussagen für die Filterung. Die PHP -Standardbibliothek bietet jedoch auch eine prägnantere Funktion - array_filter () , die für diese Anforderung ausgelegt ist. Dann ist die Frage:
Angenommen, wir haben eine Reihe von Benutzerlisten und möchten Benutzer älter als 18 Jahre herausfiltern.
$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;
});
In Bezug auf die Code -Lesbarkeit ist Array_filter () kompakter und klarer, insbesondere wenn die Logik einfach ist.
Vergleichen wir die Leistungsunterschiede zwischen den beiden mit einer großen Datenmenge über ein einfaches Testskript.
$users = [];
for ($i = 0; $i < 100000; $i++) {
$users[] = ['name' => "User$i", 'age' => rand(10, 50)];
}
// verwenden foreach
$start = microtime(true);
$adults1 = [];
foreach ($users as $user) {
if ($user['age'] > 18) {
$adults1[] = $user;
}
}
$time1 = microtime(true) - $start;
// verwenden array_filter
$start = microtime(true);
$adults2 = array_filter($users, function($user) {
return $user['age'] > 18;
});
$time2 = microtime(true) - $start;
echo "foreach zeitaufwendig: {$time1} Zweite\n";
echo "array_filter zeitaufwendig: {$time2} Zweite\n";
foreach zeitaufwendig: 0.025 Zweite
array_filter zeitaufwendig: 0.027 Zweite
Wie zu sehen ist, ist der Leistungsunterschied minimal , und selbst in einigen Fällen ist es etwas schneller, da Array_filter () im Wesentlichen auch Schleifen intern verwendet und auch den Overhead eines Funktionsaufrufs umfasst.
Empfohlene Szenarien, in denen Array_filter () verwendet wird:
Die Bedingungen sind einfach und der Code ist klarer.
Möchten Sie Code in einem funktionalen Stil schreiben.
Die Datenverarbeitungskette muss mit anderen Array -Funktionen verwendet werden (z. B. Array_Map () ).
Empfohlene Szenarien foreach:
Notwendigkeit einer höheren Leistung und endgültigen Optimierung.
Die bedingte Logik ist komplex oder erfordert eine Unterbrechung von Schleifen.
Zusätzliche Vorgänge sind erforderlich, um das ursprüngliche Array (z. B. Referenzzuordnung usw.) durchzuführen.
Während für Foreach in einigen Fällen etwas besser sein kann, bietet Array_filter () eine elegantere Lösung, insbesondere bei der Verfolgung der Code -Lesbarkeit und -wartbarkeit. In Bezug auf die Leistung ist der Unterschied zwischen beiden minimal, und die Wahl sollte eher auf dem tatsächlichen Szenario basieren, als blind "Effizienz" zu verfolgen .
Wenn Sie möchten, dass der Code leichter verstehen und pflegen kann, können Sie auch Array_Filter () versuchen!