In PHP ist die Funktion array_diff_assoc() dafür konzipiert, den Unterschied zwischen zwei Arrays zu finden und gleichzeitig den Schlüsselwert zu priorisieren Paare. Wenn diese Funktion jedoch zum Filtern von Zeilen aus einem 2D-Array basierend auf der Schnittmenge mit einem anderen 2D-Array verwendet wird, liefert sie möglicherweise nicht immer die erwarteten Ergebnisse.
Das Problem entsteht aufgrund von der strikte Vergleich, der von array_diff_assoc() durchgeführt wird. Es vergleicht während des Vergleichs Zeichenfolgendarstellungen von Schlüssel-Wert-Paaren. Das bedeutet, dass selbst wenn zwei Schlüssel-Wert-Paare dieselben Werte enthalten, sie nicht als gleich betrachtet werden, es sei denn, ihre Zeichenfolgendarstellungen sind identisch.
Betrachten Sie die folgenden Beispieldaten:
$array1 = [
[12 => 'new q sets'],
[11 => 'common set']
];
$array2 = [
[11 => 'common set']
];
Wenn wir versuchen, array_diff_assoc() zu verwenden, um $array1 basierend auf den Zeilen in $array2 zu filtern, erhalten wir eine falsche Ausgabe:
$output = array_diff_assoc($array1, $array2);
print_r($output);
// Output: [
// [11 => 'common set']
// ]
Diese Ausgabe zeigt, dass die gemeinsame Zeile im Ergebnis vorhanden ist, während die beabsichtigte Ausgabe die exklusive Zeile von $array1 enthalten sollte.
Wie bereits erwähnt, liegt das Problem im strengen Vergleich, der von array_diff_assoc() durchgeführt wird. Beim Vergleich der folgenden zwei Arrays:
Array ( [0] => "Array" [1] => "Array" )
Array ( [0] => "Array" )
Die Funktion gibt als Ergebnis das unterschiedliche Schlüssel-Wert-Paar zurück, da die Schlüssel-Wert-Paare nicht stringidentisch sind.
Um dieses Problem zu beheben, können wir einen etwas anderen Ansatz verwenden, der das Vorhandensein bestimmter Schlüsselwerte in den Arrays prüft:
$filteredRows = array_filter($array1, function($row) use ($array2) {
return !in_array($row, $array2);
});
print_r($filteredRows);
// Output: [
// [12 => 'new q sets']
// ]
Dieser Ansatz verwendet in_array(), um zu prüfen, ob jede Zeile von $array1 in $array2 vorhanden ist. Wenn eine Zeile in $array2 nicht vorhanden ist, wird sie in die gefilterten Ergebnisse einbezogen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3