strnatcasecmp()
Die PHP-Funktion strnatcasecmp() vergleicht zwei Strings ohne Berücksichtigung der Groß- und Kleinschreibung nach dem "natürlichen Ordnung"-Algorithmus.
Einführung
strnatcasecmp() vergleicht zwei Strings mithilfe eines „natürlichen Ordnung"-Algorithmus, ohne Berücksichtigung der Groß- und Kleinschreibung. „Natürliche Ordnung" bedeutet, dass in den Strings enthaltene Zahlen nach ihrem numerischen Wert verglichen werden, nicht Zeichen für Zeichen — so wird "file2" vor "file10" einsortiert, wie ein Mensch es erwarten würde. Der einfache alphabetische Vergleich von strcasecmp() würde stattdessen "file10" zuerst platzieren, da '1' vor '2' kommt.
Diese Seite behandelt die Signatur der Funktion, ihren Rückgabewert, die Unterschiede zu verwandten Vergleichsfunktionen und ihre Verwendung als Sortier-Callback.
Syntax
strnatcasecmp(string $string1, string $string2): int| Parameter | Beschreibung |
|---|---|
$string1 | Der erste zu vergleichende String. |
$string2 | Der zweite zu vergleichende String. |
Die Funktion ist binärsicher (sie funktioniert mit Strings, die Null-Bytes enthalten) und nicht case-sensitiv ("FILE" und "file" werden als gleich behandelt).
Rückgabewert
strnatcasecmp() gibt einen int zurück, dessen Vorzeichen das Ergebnis anzeigt — der genaue Betrag ist implementierungsabhängig, daher immer gegen 0 testen, nicht gegen eine bestimmte Zahl:
| Rückgabe | Bedeutung |
|---|---|
< 0 (negativ) | $string1 ist kleiner als $string2 |
> 0 (positiv) | $string1 ist größer als $string2 |
0 | Die beiden Strings sind gleich |
Einfaches Beispiel
Da die Zahlen nach Wert verglichen werden (1 < 10), lautet die Ausgabe:
file1.txt is less than file10.txtNatürlicher vs. regulärer Vergleich
Das ist der eigentliche Grund, warum strnatcasecmp() existiert. Bei einem regulären Vergleich werden Strings Zeichen für Zeichen verglichen, so schlägt '1' (die erste Ziffer von 10) '2'. Die natürliche Reihenfolge betrachtet die vollständige Zahl:
<?php
$a = "img12";
$b = "IMG2";
// Regular, case-insensitive: '1' < '2', so img12 comes first
echo strcasecmp($a, $b) . "\n"; // negative
// Natural, case-insensitive: 12 > 2, so img12 comes second
echo strnatcasecmp($a, $b) . "\n"; // positiveDie beiden Funktionen liefern unterschiedliche Ergebnisse hinsichtlich der Reihenfolge, und strnatcasecmp() ignoriert die Groß-/Kleinschreibung von IMG vs img und gibt das menschenfreundliche Ergebnis zurück.
Ein Array natürlich sortieren
Die häufigste reale Verwendung ist als Vergleichs-Callback für usort(), um Dateinamen oder versionsähnliche Strings zu sortieren:
<?php
$files = ["file10.txt", "File2.txt", "file1.txt"];
usort($files, "strnatcasecmp");
print_r($files);Ausgabe:
Array
(
[0] => file1.txt
[1] => File2.txt
[2] => file10.txt
)Wenn ein Array an Ort und Stelle nach Wert sortiert werden soll, wendet natcasesort() dieselbe natürliche, nicht case-sensitive Sortierung an und behält dabei die Schlüssel bei.
Verwandte Funktionen
| Funktion | Natürliche Reihenfolge? | Case-sensitiv? |
|---|---|---|
strnatcasecmp() | Ja | Nein |
strnatcmp() | Ja | Ja |
strcasecmp() | Nein | Nein |
strcmp() | Nein | Ja |
Verwende strnatcasecmp(), wenn du sowohl natürliche Reihenfolge als auch Groß-/Kleinschreibungsunempfindlichkeit benötigst; wähle strnatcmp(), wenn die Groß-/Kleinschreibung eine Rolle spielt.
Fazit
strnatcasecmp() vergleicht zwei Strings in der Reihenfolge, die ein Mensch erwarten würde — eingebettete Zahlen werden als Zahlen behandelt und die Groß-/Kleinschreibung von Buchstaben wird ignoriert. Verzweige immer auf das Vorzeichen des Rückgabewerts, und nutze diese Funktion (oft zusammen mit usort()), wenn du Dateinamen, Labels oder beliebige Strings sortierst, die Text und Zahlen mischen.