Aktueller Standort: Startseite> Neueste Artikel> Diskussion über die Reihenfolge von Array_Slice und Array_filter

Diskussion über die Reihenfolge von Array_Slice und Array_filter

gitbox 2025-05-20

In PHP sind Array_Slice () und Array_Filter () zwei häufig verwendete Array -Verarbeitungsfunktionen. Einer wird verwendet, um einen Teil eines Arrays abzufangen, und der andere wird verwendet, um Elemente in dem Array zu filtern, das den Kriterien entspricht. Wenn wir Daten verarbeiten, müssen wir diese beiden Funktionen häufig zusammen verwenden. Aber hast du darüber nachgedacht:

Die Antwort lautet: Ja, die Reihenfolge wirkt sich auf die Ergebnisse aus , und in einigen Szenarien sind die Auswirkungen sehr groß.

Eine kurze Überprüfung der Funktionseinführung

  • Array_filter (Array $ Array, Callable | null $ callback = null): Array
    Gibt die von der Rückruffunktion gefilterte Array zurück. Wenn die Rückruffunktion nicht übergeben wird, entzieht PHP alle Elemente automatisch mit einem Wert von FALSE (einschließlich 0 , '' , Null , False usw.).

  • Array_Slice (Array $ Array, int $ offset,? int $ länge = null, bool $ preserve_keys = false): Array
    Gibt eine Reihe von Sub-Arrays im Array zurück. Unterstützt negative Offsets und Sie können wählen, ob Sie den ursprünglichen Schlüssel beibehalten möchten.

Beispielanalyse

Angenommen, wir haben das folgende Array:

 $data = [0, 1, 2, 3, 4, 5];

Wir müssen Folgendes tun:

  1. Filtern Sie Elemente mit Werten mehr als 2 heraus;

  2. Nehmen Sie die ersten beiden Elemente aus dem gefilterten Ergebnis.

Array_filter und dann Array_Slice

 $filtered = array_filter($data, function($item) {
    return $item > 2;
});
$result = array_slice($filtered, 0, 2);
print_r($result);

Ausgabe:

 Array
(
    [3] => 3
    [4] => 4
)

Beachten Sie, dass die Ausgabe hier darin besteht, Elemente mehr als 2 (d. H. 3, 4, 5) aus dem ursprünglichen Array herauszufiltern und dann die ersten beiden zu nehmen. Wenn Sie die Proservation_Keys nicht auf true einstellen, wird Array_Slice wieder integriert (das Standardverhalten, es auf False einzustellen) und der Ausgang wird:

 $result = array_slice(array_values($filtered), 0, 2);

Ausgabe:

 Array
(
    [0] => 3
    [1] => 4
)

Array_Slice zuerst und Array_filter

 $sliced = array_slice($data, 0, 4);
$result = array_filter($sliced, function($item) {
    return $item > 2;
});
print_r($result);

Ausgabe:

 Array
(
    [3] => 3
)

Hier nehmen wir die ersten 4 Elemente (0, 1, 2, 3) und filtern dann die Elemente mehr als 2, und es gibt nur ein Ergebnis: 3 .

Welche Reihenfolge ist angemessener?

  • Wenn Sie die ersten Ergebnisse aus allen Elementen, die den Kriterien erfüllen, zuerst erfüllen möchten : Array_Filter , dann Array_Slice .

  • Wenn Sie Elemente filtern möchten, die die Kriterien aus den ersten Elementen im ursprünglichen Array erfüllen : Array_Slice zuerst, dann array_filter .

Dies ist besonders wichtig, wenn Paging, Datenflussoptimierung und Verarbeitung großer Datensätze verarbeitet werden.

Beispiele für Anwendungen in realen Szenarien

Angenommen, Sie haben eine API -Schnittstelle https://gitbox.net/api/posts , die eine Reihe von Beiträgen zurückgibt. Sie möchten die Top 5 Beiträge mit dem Schlüsselwort "PHP" im Titel herausfiltern:

 $response = file_get_contents('https://gitbox.net/api/posts');
$posts = json_decode($response, true);

$filtered = array_filter($posts, function($post) {
    return strpos($post['title'], 'PHP') !== false;
});

$topFive = array_slice(array_values($filtered), 0, 5);

print_r($topFive);

Wenn Sie dies schreiben, stellt Sie sicher, dass Sie wirklich "die Top 5 aller Beiträge mit PHP" erhalten.

Umgekehrt, wenn Sie nur diejenigen, die "PHP" von den ersten 10 Beiträgen enthalten, die Sie zurückgeben, filtern möchten:

 $topTen = array_slice($posts, 0, 10);
$filtered = array_filter($topTen, function($post) {
    return strpos($post['title'], 'PHP') !== false;
});

print_r($filtered);

Zusammenfassung

  • Unterschiedliche Bestellungen, die Ergebnisse können sehr unterschiedlich sein.

  • Filter zuerst und dann abfangen, das für "bevorzugte Teile aller Daten" anwendbar ist;

  • Intercept zuerst und dann filtern, der für "den vorherigen Teil der Daten vor dem Filtern einschränken" ist.

Bei Verwendung der Kombination von Array_Slice und Array_filter müssen Sie den Umfang Ihrer Zieldaten klären, um die Reihenfolge zu bestimmen und logische Fehler oder unerwartete Ergebnisse zu vermeiden.