In PHP wird die Funktion array_intersect_uassoc verwendet, um die Schlüssel und Werte von zwei Arrays zu vergleichen, wodurch der Teil zurückgegeben wird, in dem die Schlüsselwertepaare in den beiden Arrays gleich sind. Was es von Array_intersect_assoc unterscheidet, ist, dass Array_intersect_Uassoc es Benutzern ermöglicht, die Vergleichsfunktion von Tasten anzupassen.
Die Funktion ist wie folgt definiert:
array_intersect_uassoc(array $array1, array $array2, callable $key_compare_func): array
$ array1 und $ array2 sind zwei Arrays, die am Vergleich teilnehmen.
$ key_compare_func ist eine benutzerdefinierte Funktion zum Vergleich von Schlüssel, und der Rückgabewert ähnelt STRCMP .
Wenn die Reihenfolge der Schlüsselwertpaare von Arrays inkonsistent ist, wird Array_intersect_uassoc weiterhin basierend auf der entsprechenden Beziehung zwischen Schlüssel und Werten vergleichen. Das heißt, die Schlüssel und Werte müssen "gleich" sein, um im Ergebnis zu erscheinen, unabhängig von ihrer Ordnung im Array.
Zum Beispiel:
<?php
$array1 = [
'a' => 1,
'b' => 2,
];
$array2 = [
'b' => 2,
'a' => 1,
];
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);
Ausgabe:
Array
(
[a] => 1
[b] => 2
)
Auch wenn sich die Reihenfolge der Schlüsselwertpaare in $ array2 von $ array1 unterscheidet, enthält das Ergebnis immer noch alle passenden Schlüsselwertpaare.
Unter der Annahme, dass Ihre benutzerdefinierte Vergleichsfunktion empfindlich gegenüber der Bestellung ist, kann dies zu entsprechenden Ausfällen führen. Die Standard-String-Vergleichsfunktion STRCMP ist ordnungsunabhängig. Wenn die von Ihnen geschriebene Vergleichsfunktion jedoch Reihenfolge oder andere Bedingungen enthält, kann das Ergebnis unterschiedlich sein.
Wenn Sie sicherstellen möchten, dass die Schlüsselwertpaare auch dann richtig übereinstimmen, wenn sie sich in verschiedenen Bestellungen befinden, können Sie die folgenden Vorschläge befolgen:
Stellen Sie sicher, dass die Vergleichsfunktion nur die Werte des Schlüssels selbst vergleicht und keine sequentielle Logik einbringt.
Sortieren Sie zuerst die Schlüssel des Arrays und verwenden Sie dann Array_intersect_Uassoc zum Vergleich, um die Auswirkungen von Auftragsunterschieden zu vermeiden.
Beispiel: Sortieren Sie zuerst und vergleichen Sie dann
<?php
$array1 = [
'b' => 2,
'a' => 1,
];
$array2 = [
'a' => 1,
'b' => 2,
];
// Sortieren Sie die Schlüssel
ksort($array1);
ksort($array2);
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);
Auf diese Weise ist die Reihenfolge nach der Sortierung, selbst wenn die anfängliche Reihenfolge unterschiedlich ist, konsistent, wodurch die möglichen unerwarteten Ergebnisse von Auftragsunterschieden vermieden werden.
array_intersect_uassoc vergleicht Schlüssel und Werte, und die Reihenfolge selbst wirkt sich nicht auf das Matching -Ergebnis aus.
Benutzerdefinierte Schlüsselvergleichsfunktionen sollten vermeiden, nacheinander verwandte Logik.
Um auf der sicheren Seite zu sein, können Sie mit KSORT () die Arrays sortieren, die am Vergleich zuerst teilnehmen, um eine einheitliche Reihenfolge zu gewährleisten.
<?php
$array1 = [
'b' => 2,
'a' => 1,
];
$array2 = [
'a' => 1,
'b' => 2,
];
ksort($array1);
ksort($array2);
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);