Signatur
Beschreibung
strnatcasecmp() vergleicht zwei Strings nach dem sogenannten Natural Order-Algorithmus, wie ihn Menschen intuitiv anwenden würden – also so, dass z. B. "img10" nach "img9" sortiert wird und nicht davor (wie es bei einem einfachen lexikografischen Vergleich der Fall wäre). Im Gegensatz zu strnatcmp() ist der Vergleich nicht case-sensitiv, d. h. Groß- und Kleinschreibung wird ignoriert.
Der Rückgabewert entspricht dem Muster vergleichbarer Vergleichsfunktionen: kleiner als 0, wenn string1 kleiner als string2 ist; 0 bei Gleichheit; größer als 0, wenn string1 größer ist. Damit eignet sich die Funktion direkt als Vergleichs-Callback für usort() oder uasort().
Typische Anwendungsfälle sind das Sortieren von Dateinamen, Versionsnummern oder anderen gemischten alphanumerischen Zeichenketten, bei denen die enthaltenen Zahlenfolgen numerisch (nicht zeichenweise) verglichen werden sollen – unabhängig von der Schreibweise der alphabetischen Bestandteile.
Für einen case-sensitiven Vergleich nach natürlicher Reihenfolge steht strnatcmp() zur Verfügung; für einfache case-insensitive Vergleiche ohne Natural Order eignet sich strcasecmp().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string1 Pflicht | string | Der erste zu vergleichende String. | |
| $string2 Pflicht | string | Der zweite zu vergleichende String. |
Rückgabewert
0 zurück, wenn string1 kleiner als string2 ist; 0, wenn beide Strings gleich sind; einen Wert größer als 0, wenn string1 größer als string2 ist. Der Vergleich erfolgt nach natürlicher Reihenfolge ohne Berücksichtigung der Groß-/Kleinschreibung.Beispiele
Vergleich von Dateinamen mit Zahlen (case-insensitiv)
<?php
$files = ['IMG10.jpg', 'img2.jpg', 'Img1.jpg', 'IMG20.jpg', 'img3.jpg'];
usort($files, 'strnatcasecmp');
foreach ($files as $file) {
echo $file . PHP_EOL;
}
Direkter Vergleich zweier Strings
<?php
$result1 = strnatcasecmp('Version10', 'version9');
echo $result1 > 0 ? 'Version10 kommt nach version9' : 'Version10 kommt vor version9';
echo PHP_EOL;
$result2 = strnatcasecmp('ABC', 'abc');
echo $result2 === 0 ? 'ABC und abc sind gleich (case-insensitiv)' : 'Unterschiedlich';
echo PHP_EOL;
$result3 = strnatcasecmp('img2', 'IMG10');
echo $result3 < 0 ? 'img2 kommt vor IMG10' : 'img2 kommt nach IMG10';
// Wichtig · Fallstricke
Der Natural-Order-Algorithmus behandelt zusammenhängende Ziffernfolgen als ganze Zahlen beim Vergleich. Das bedeutet: "img10" wird nach "img9" einsortiert, weil 10 > 9 – anders als bei einem zeichenweisen Vergleich, bei dem '1' < '9' wäre.
Leerzeichen am Beginn von Zahlensequenzen können das Ergebnis beeinflussen. Strings wie " 10" und "10" können unterschiedlich behandelt werden. Es empfiehlt sich, die Eingaben ggf. vorher mit trim() zu bereinigen.
Da die Funktion eine int-Wert zurückliefert, der nicht auf -1, 0 oder 1 beschränkt ist, sollte der Rückgabewert nur mit den Operatoren <, == und > geprüft werden – nicht auf einen genauen Zahlenwert.