W3docs

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
ParameterBeschreibung
$string1Der erste zu vergleichende String.
$string2Der 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ückgabeBedeutung
< 0 (negativ)$string1 ist kleiner als $string2
> 0 (positiv)$string1 ist größer als $string2
0Die beiden Strings sind gleich

Einfaches Beispiel

php— editable, runs on the server

Da die Zahlen nach Wert verglichen werden (1 < 10), lautet die Ausgabe:

file1.txt is less than file10.txt

Natü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";   // positive

Die 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

FunktionNatürliche Reihenfolge?Case-sensitiv?
strnatcasecmp()JaNein
strnatcmp()JaJa
strcasecmp()NeinNein
strcmp()NeinJa

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.

Übung

Übung
Welche Rolle spielt die Funktion strnatcasecmp() in PHP?
Welche Rolle spielt die Funktion strnatcasecmp() in PHP?
Was this page helpful?