array_diff () ist eine sehr häufige Funktion in PHP, um Unterschiede zwischen Arrays zu berechnen. Einfach ausgedrückt, es gibt Elemente zurück, die im ersten Array existieren, aber nicht in anderen Arrays. Die Funktion array_diff () ist jedoch bei der Durchführung von Vergleiche sensibel. Das heißt, wenn zwei Arrays dieselbe Zeichenfolge haben, aber unterschiedliche obere und untere Fälle haben, betrachtet Array_Diff () sie als unterschiedliche Elemente.
Wenn Sie bei der Durchführung von Array -Differenzberechnungen den Fall ignorieren möchten, führt die Verwendung von Array_Diff () direkt zu unerwarteten Ergebnissen. Nehmen wir beispielsweise an, wir haben zwei Arrays, von denen einer Strings mit unterschiedlichen oberen und unteren Fällen enthält:
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$result = array_diff($array1, $array2);
print_r($result);
Das Ausgangsergebnis ist:
Array
(
[0] => Apple
[1] => Banana
[2] => Cherry
)
Dieser Code zeigt, dass array_diff () der Meinung ist, dass "Apple" und "Apple" unterschiedlich sind, obwohl ihr Inhalt gleich ist. Da Array_Diff () standardmäßig sensibel ist, auch wenn der Inhalt der beiden Zeichenfolgen gleich ist, sofern der Fall unterschiedlich ist, wird er dennoch als unterschiedliche Elemente angesehen.
In der tatsächlichen Entwicklung begegnen Sie häufig Situationen, in denen Zeichenfolgen gemischtes Fall enthalten, z. B. Benutzereingaben, gespeicherte Datenbankfelder oder URL -Adressen. Wenn Sie diese gemischten Fallketten vergleichen müssen, kann Array_diff () ungenaue Ergebnisse verursachen.
Zum Beispiel:
$array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];
$result = array_diff($array1, $array2);
print_r($result);
Das Ausgangsergebnis ist:
Array
(
[0] => https://example.com/Page
[1] => https://m66.net/Home
)
Obwohl der tatsächliche Inhalt dieser beiden URLs gleich ist, beurteilen Array_Diff () fälschlicherweise, dass sie aufgrund unterschiedlicher Fälle unterschiedlich sind.
Um das oben erwähnte Fallsensitivitätsproblem zu lösen, müssen wir einige zusätzliche Schritte unternehmen. Hier sind einige mögliche Lösungen:
Eine häufige Lösung besteht darin, alle Zeichenfolgen in Arrays in ein gleichmäßiger Fall (Kleinbuchstaben oder Großbuchstaben) umzuwandeln und dann Array_Diff () -Rechnungen durchzuführen. Dies stellt sicher, dass der Fall beim Vergleich ignoriert wird.
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$array1_lower = array_map('strtolower', $array1);
$array2_lower = array_map('strtolower', $array2);
$result = array_diff($array1_lower, $array2_lower);
print_r($result);
Ausgangsergebnis:
Array
(
)
Nach der Verarbeitung wird array_diff () denken, dass "Apple" und "Apple" gleich sind und schließlich ein leeres Array zurückgeben, was darauf hinweist, dass es keinen Unterschied gibt.
Wenn Sie komplexere Vergleichsregeln benötigen, können Sie Array_udiff () verwenden, mit denen Sie eine benutzerdefinierte Vergleichsfunktion übergeben können, um Fallprobleme beim Vergleich zu behandeln. Hier ist ein einfaches Beispiel:
function caseInsensitiveCompare($a, $b) {
return strcasecmp($a, $b);
}
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$result = array_uDiff($array1, $array2, "caseInsensitiveCompare");
print_r($result);
Ausgangsergebnis:
Array
(
)
Hier verwenden wir die Funktion von StrCasecmp () , die Fall-unempfindliche Vergleiche erzeugt, die Fallunterschiede effektiv vermeiden können.
Wenn Sie URLs vergleichen müssen und den Fall ignorieren möchten, insbesondere der Domänenname-Teil, können Sie die integrierte PHP- Funktion von PHP verwenden, um die URL zu analysieren, und dann den Fall des Domänennamenteils einheitlich umwandeln. Zum Beispiel:
function normalize_url($url) {
$parsed_url = parse_url($url);
$parsed_url['host'] = strtolower($parsed_url['host']);
return $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
}
$array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];
$array1_normalized = array_map('normalize_url', $array1);
$array2_normalized = array_map('normalize_url', $array2);
$result = array_diff($array1_normalized, $array2_normalized);
print_r($result);
Ausgangsergebnis:
Array
(
)
Durch gleichmäßig konvertierende Domain -Namen in Kleinbuchstaben können Sie falsche Vergleiche aufgrund unterschiedlicher Groß- und Kleinbuchstaben vermeiden.