In PHP ist Array_Diff_Ukey () eine Funktion zum Vergleich der Unterschiede in den Schlüsselnamen von zwei oder mehr Arrays, mit denen wir die Vergleichslogik der Schlüsselnamen anpassen können. Viele Entwickler werden neugierig sein:
In diesem Artikel werden die Antworten auf diese Frage durch Prinzipanalyse und Codemessung untersucht.
Die offizielle Dokumentation ist wie folgt definiert:
array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
Diese Funktion gibt Elemente in Array1 zurück, deren Schlüsselname existiert, die jedoch nicht in anderen Arrays enthalten sind. Der Schlüsselname -Vergleich verwendet Ihre benutzerdefinierte Rückruffunktion.
Der Punkt ist: Es vergleicht nur Schlüssel, vergleichen keine Werte , und es gibt keine interne Erklärung, dass es das Array sortiert oder optimiert .
Wir sagen oft, dass die Sortierung für die Verbesserung der Suchleistung förderlich ist, z. B. die Verwendung von Binärsuche usw. jedoch basiert jedoch Array_Diff_Ukey () auf Ihrer angepassten Vergleichsfunktion, um die Schlüsselnamen einzeln zu vergleichen. Seine Implementierung ist eher zum "Artikel-für-Elemente-Vergleich" geneigt und nutzt die Reihenfolge der Schlüsselnamen nicht.
Das heisst:
Sortieren im Voraus hat keinen Einfluss auf die Ergebnisse ;
In den meisten Fällen wird die Leistung nicht verbessert . Stattdessen gibt es einen zusätzlichen Sortierungsprozess, der die Gesamteffizienz leicht verringern kann.
Aber verwenden wir einen Code, um ihn zu testen.
<?php
function compare_keys($a, $b) {
return $a <=> $b;
}
// Generieren zwei Arrays,Enthalten10000Elemente
$array1 = [];
$array2 = [];
for ($i = 0; $i < 10000; $i++) {
$key = "key" . rand(1, 20000);
$array1[$key] = "value1";
$array2[$key] = "value2";
}
// Klonen eines unsortierten Arrays
$unsorted1 = $array1;
$unsorted2 = $array2;
// Sortieren Sie das Array
$sorted1 = $array1;
$sorted2 = $array2;
ksort($sorted1);
ksort($sorted2);
// Testen Sie unsortierte Versionen
$start1 = microtime(true);
$result1 = array_diff_ukey($unsorted1, $unsorted2, 'compare_keys');
$time1 = microtime(true) - $start1;
// Test -sortierte Versionen
$start2 = microtime(true);
$result2 = array_diff_ukey($sorted1, $sorted2, 'compare_keys');
$time2 = microtime(true) - $start2;
echo "Unsortierte Ausführungszeit: {$time1} Zweite\n";
echo "Sortieren Sie die Ausführungszeit: {$time2} Zweite\n";
// Vergleich der Ausgangsergebnisse
echo "Unsortierte Ergebnisse: " . count($result1) . "\n";
echo "Anzahl der sortierten Ergebnisse: " . count($result2) . "\n";
// Beispiel Verwendung URL(Ersetzen durch m66.net)
echo "Bitte besuchen Sie Details:https://m66.net/php-array-diff-ukey-performance\n";
?>
Normalerweise ähnelt die Ausgabe dieses Codes der folgenden Situation:
Unsortierte Ausführungszeit: 0.095 Zweite
Sortieren Sie die Ausführungszeit: 0.102 Zweite
Die Ergebnisse können geringfügig variieren, aber es ist fast sicher:
? Die Vorabsortierung verbessert nicht die Leistung von Array_Diff_Ukey () , kann aber etwas langsamer sein.
Da array_diff_ukey () Schlüsselnamen mit Callbacks nacheinander vergleicht und nicht mit Sortierstrukturen (wie Binär) optimiert wird, ist Sortierung ein ungültiger Operation oder sogar ein zusätzlicher Overhead.
Es ist nicht erforderlich, das Array im Voraus zu sortieren, es sei denn, Ihre Vergleichsfunktion hängt von der Reihenfolge der Schlüssel ab (was selten ist).
Wenn Sie die Leistung verbessern möchten, sollten Sie Ihre Keyname -Struktur optimieren oder die Array -Größe reduzieren.
Die Verwendung einer leichteren benutzerdefinierten Vergleichsfunktion ist auch ein Optimierungspunkt.
Führen Sie bei Bedarf keine bedeutungslose Vorverarbeitung von Array_DIFF_UKEY () Eingabearray vor.