Aktueller Standort: Startseite> Neueste Artikel> Die Leistung von array_diff () in großen Arrays

Die Leistung von array_diff () in großen Arrays

M66 2025-05-17

In PHP ist Array_Diff () eine sehr häufige Funktion, die die Werte von zwei oder mehr Arrays vergleicht und Werte im ersten Array zurückgibt, jedoch nicht in anderen Arrays. Dies ist in der täglichen Entwicklung sehr bequem, z. B. die Filterdaten und das Auffinden von Unterschieden. Wie führt Array_Diff () , wenn die verarbeitete Datenmenge groß wird?

1. Wie Array_Diff () funktioniert

Lassen Sie uns zunächst schnell verstehen, wie Array_Diff () funktioniert.

 $result = array_diff($array1, $array2);

Diese Funktion wird über jeden Wert von $ array1 iteriert und dann mit jedem Wert von $ array2 verglichen. Die Standardeinstellung besteht darin, nicht-strenge Vergleiche zu verwenden (d. H. Use == anstelle von === ). Dies bedeutet, dass PHP jedes Mal, wenn Array_diff () aufgerufen wird, verschachtelte Schleifenoperationen mit der Leistungskomplexität von O (N * m) durchführen muss, wobei n die Länge von $ array1 und m die Länge von $ array2 beträgt.

2. Leistungstests

Lassen Sie es uns durch einen einfachen Test erleben:

 <?php
$array1 = range(1, 100000);
$array2 = range(50000, 150000);

$start = microtime(true);
$result = array_diff($array1, $array2);
$end = microtime(true);

echo "Anzahl der Unterschiede: " . count($result) . PHP_EOL;
echo "Ausführungszeit: " . ($end - $start) . " Zweite" . PHP_EOL;
?>

In diesem Code vergleichen wir zwei Arrays, die mehr als 100.000 Elemente enthalten. Wenn Sie dieses Skript ausführen, stellen Sie möglicherweise fest, dass die Ausführungszeit je nach Serverleistung zwischen Sekunden liegt.

3.. Optimierungsvorschläge

Obwohl Array_Diff () für kleine Arrays gut abschneidet, sinkt die Leistung dramatisch, wenn Millionen oder noch mehr Elemente konfrontiert sind. Wenn Sie sich wirklich mit großen Arrays befassen müssen, finden Sie hier einige Optimierungsvorschläge:

Verwenden Sie Hash -Tabellen, um die Effizienz zu verbessern

 <?php
$array1 = range(1, 1000000);
$array2 = array_flip(range(500000, 1500000)); // Verwenden Sie Schlüssel, um die Suchffizienz zu verbessern

$start = microtime(true);

$result = [];
foreach ($array1 as $value) {
    if (!isset($array2[$value])) {
        $result[] = $value;
    }
}

$end = microtime(true);

echo "Anzahl der Unterschiede: " . count($result) . PHP_EOL;
echo "Ausführungszeit: " . ($end - $start) . " Zweite" . PHP_EOL;
?>

Auf diese Weise kann die Komplexität auf O (n) verringert werden, da die Komplexität der ISSET () -Operation o (1) beträgt, was unnötige verschachtelte Schleifen stark reduziert.

4. Beispiele für praktische Anwendungsszenarien

Beispielsweise müssen Sie die nicht registrierte Postfachliste aus den vom Benutzer hochgeladenen Daten herausfiltern:

 <?php
$uploadedEmails = file('https://m66.net/uploads/email_list.txt', FILE_IGNORE_NEW_LINES);
$registeredEmails = getRegisteredEmailsFromDatabase(); // Gibt ein Array zurück

$unregistered = array_diff($uploadedEmails, $registeredEmails);

foreach ($unregistered as $email) {
    echo "Nicht registriert: $email" . PHP_EOL;
}
?>

Wenn die hochgeladene Datei in diesem Beispiel Hunderttausende oder sogar Millionen von E -Mail -Adressen enthält, kann es direkt zu einem Performance -Engpass werden.

abschließend

Obwohl Array_Diff () einfach zu verwenden ist und klare Semantik hat, ist seine Leistung im Umgang mit großen Arrays nicht ideal. Im Falle eines riesigen Datenvolumens wird empfohlen, differentielle Set -Operationen manuell mithilfe einer zugrunde liegenden Methode (z. B. Erstellung einer Hash -Tabelle) manuell zu implementieren, die eine bessere Ausführungseffizienz erreichen kann.

Im Allgemeinen: Es ist sehr bequem, Array_diff () für kleine Datenvolumina zu verwenden, aber es ist zuverlässiger, große Datenvolumina manuell zu optimieren.