Start · Sprachen · PHP · Referenz · strnatcasecmp

strnatcasecmp

Funktion

Vergleicht zwei Zeichenketten nach natürlicher Sortierreihenfolge ohne Berücksichtigung der Groß-/Kleinschreibung.

seit PHP 4.0.0 Kategorie: string

Signatur

strnatcasecmp(string $string1, string $string2): int

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

Typ
int
Beschreibung
Gibt einen Wert kleiner als 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;
}
Img1.jpg img2.jpg img3.jpg IMG10.jpg IMG20.jpg

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';
Version10 kommt nach version9 ABC und abc sind gleich (case-insensitiv) img2 kommt vor 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.