In PHP ist Array_filter () eine sehr bequeme Funktion, um Elemente herauszufiltern, die die Bedingungen aus einem Array erfüllen. Wenn wir jedoch einem gegenüberstehen (z. B. Hunderttausende oder sogar Millionen Elemente), können Leistungsprobleme zu einem Faktor werden, der berücksichtigt werden muss.
In diesem Artikel wird die Leistung von Array_filter () bei der Verarbeitung großer Arrays analysiert und einige praktische Optimierungsstrategien untersucht.
In PHP lautet die grundlegende Syntax von Array_filter () wie folgt:
$result = array_filter($array, function($value) {
return Zustand;
});
Es funktioniert, indem Sie die Rückruffunktion einmal in jedem Element des Arrays aufrufen und das Element behalten, das zurückgegeben wird.
Dies bedeutet, dass seine Zeitkomplexität O (n) ist, wobei n die Anzahl der Array -Elemente ist.
Im Umgang mit großen Arrays können Leistung Engpässe aus den folgenden Aspekten stammen:
Die Komplexität der Rückruffunktion selbst : Wenn Ihre Rückruflogik sehr komplex ist, verdoppelt sie den Leistungsverbrauch.
Speicherverwendung : Array_filter () erstellt ein neues Array, und das ursprüngliche Array wird immer noch im Speicher erhalten, sodass es bei der Verarbeitung von Big Data viel Speicher auffressen kann.
Overhead anonymer Funktionen : Obwohl die anonymen Funktionen sehr syntaktisch elegant sind, ist in Hochleistungsszenarien ihre Anrufaufwand möglicherweise etwas höher als die der gewöhnlichen Funktionen.
$largeArray = range(1, 1000000);
$filtered = array_filter($largeArray, function($value) {
return $value % 2 === 0;
});
Obwohl die Bedingungen in diesem Beispiel sehr einfach sind, sind in realen Projekten die Rückruffunktionen normalerweise komplexer und die Ausführungseffizienz wird erheblich reduziert.
Wenn Sie nur einfache Filtervorgänge ausführen müssen, können Sie für den Ersatz für Array_Filter () verwenden und den zusätzlichen Overhead vermeiden, der durch Rückruffunktionen verursacht wird:
$filtered = [];
foreach ($largeArray as $value) {
if ($value % 2 === 0) {
$filtered[] = $value;
}
}
In den meisten Fällen ist diese Methode effizienter als Array_filter () .
Der Aufwand der Schließungen ist etwas hoch. Wenn Sie häufig anrufen, können Sie die Logik in eine benannte Funktion schreiben:
function isEven($value) {
return $value % 2 === 0;
}
$filtered = array_filter($largeArray, 'isEven');
Wenn das Array sehr groß ist, wird empfohlen, es in Chargen zu verarbeiten, um zu vermeiden, dass eine große Menge Speicher gleichzeitig verbraucht wird:
$chunks = array_chunk($largeArray, 10000);
$filtered = [];
foreach ($chunks as $chunk) {
$filtered = array_merge($filtered, array_filter($chunk, 'isEven'));
}
Manchmal können wir vorläufige Filterung an der Quelle der Daten durchführen, z. B. das Hinzufügen von Filterbedingungen, wenn sie von der Datenbank oder Schnittstelle angefordert werden, um die Verarbeitung von nutzlosen Daten in der PHP -Schicht zu vermeiden.
Zum Beispiel:
// Falscher Weg:Kriechen Sie zuerst alle Daten und filtern Sie sie dann
$data = file_get_contents('https://m66.net/api/data');
$decoded = json_decode($data, true);
$filtered = array_filter($decoded, 'isEven');
// Ein besserer Ansatz:API 参数中加入筛选Zustand
$data = file_get_contents('https://m66.net/api/data?filter=even');
$filtered = json_decode($data, true);
Wenn Sie nicht alle Daten gleichzeitig zurückgeben müssen, können Sie den Generator verwenden, um ihn faul zu laden:
function filterEven($array) {
foreach ($array as $value) {
if ($value % 2 === 0) {
yield $value;
}
}
}
foreach (filterEven($largeArray) as $even) {
// Echtzeitverarbeitung $even
}
Der Generator speichert nicht alle Ergebnisse in den Speicher, gibt jedoch jeweils einen übereinstimmenden Wert zurück, der sehr ressourcensparend ist.
Obwohl Array_Filter () sehr syntaxverstört ist und für die meisten kleinen und mittelgroßen Arrays geeignet ist, gibt es tatsächlich bestimmte Leistungsrisiken im Umgang mit großen Arrays. Die Leistung kann durch die Verwendung von Foreach -Substitution, die Optimierung der Rückruflogik, die Stapelverarbeitung oder die Verwendung von Generatoren erheblich verbessert werden.
Bei leistungsempfindlichen Projekten ist die Auswahl der am besten geeigneten Möglichkeit, Daten zu filtern, der Schlüssel zur Codeoptimierung.
Verwandte Tags:
array_filter