Wie man Zeichenketten in natürlicher Reihenfolge in PHP sortiert
Erfahren Sie, wie natsort() in PHP Arrays nach natürlicher Reihenfolge sortiert und dabei Zahlen in Zeichenketten korrekt als numerische Werte behandelt.
Wenn Sie in PHP Zeichenketten sortieren, die Zahlen enthalten, liefert die standardmäßige alphabetische Sortierung oft Ergebnisse, die sich für den Menschen „falsch" anfühlen. PHPs natsort()-Funktion behebt dies, indem sie ein Array mit einem natürlichen Reihenfolge-Algorithmus sortiert — so, wie ein Mensch file1, file2, file10 anordnen würde, anstatt file1, file10, file2.
Diese Seite erklärt, was natürliche Reihenfolge-Sortierung ist, wie natsort() funktioniert (einschließlich der Tatsache, dass es Schlüssel beibehält), wie es sich von sort() unterscheidet, wie man mit Groß- und Kleinschreibung umgeht und welche häufigen Fallstricke es gibt.
Was ist natürliche Reihenfolge-Sortierung?
Die natürliche Reihenfolge-Sortierung (auch alphanumerische Sortierung genannt) behandelt Ziffernfolgen innerhalb einer Zeichenkette als einzelne Zahl und nicht als einzelne Zeichen. Bei einer einfachen alphabetischen Sortierung kommt "100" vor "2", weil der Vergleich beim ersten Zeichen stoppt und '1' in der ASCII-Tabelle kleiner als '2' ist. Die natürliche Reihenfolge-Sortierung vergleicht stattdessen 100 und 2 als Zahlen, sodass 2 korrekt zuerst kommt.
Dies ist relevant, wenn Ihre Zeichenketten Text und Zahlen mischen — Dateinamen (img10.png), Versionsbezeichnungen (v2.13) oder Elemente wie "10 Äpfel" und "2 Orangen".
Syntax
natsort(array &$array): truenatsort() nimmt das Array per Referenz, sortiert es direkt, und gibt (ab PHP 8.2) immer true zurück. In älteren Versionen ist der Rückgabetyp bool. Da das Array direkt verändert wird, weisen Sie das Ergebnis nicht zurück zu — Sie lesen die ursprüngliche Variable nach dem Aufruf.
Verwendung der Funktion natsort()
Vergleichen Sie die natürliche Reihenfolge mit einer regulären alphabetischen sort():
$fruits = array("10 apples", "2 oranges", "100 bananas");
natsort($fruits);
print_r($fruits);Ausgabe:
Array
(
[1] => 2 oranges
[0] => 10 apples
[2] => 100 bananas
)Beachten Sie, dass die ursprünglichen Schlüssel (1, 0, 2) beibehalten und mit ihren Werten verschoben werden — natsort() ist eine schlüsselerhaltende Sortierung, genau wie asort(). Wenn Sie stattdessen das einfache sort() verwenden würden, erhalten Sie das alphabetische (und neu indizierte) Ergebnis:
Array
(
[0] => 10 apples
[1] => 100 bananas
[2] => 2 oranges
)Hier landet "100 bananas" in der Mitte, weil sort() zeichenweise vergleicht.
Dateiähnliche Namen sortieren
Der klassische Anwendungsfall ist die Sortierung von Dateinamen, die auf Zahlen enden:
$files = array("file20", "file3", "file1");
natsort($files);
print_r($files);Ausgabe:
Array
(
[2] => file1
[1] => file3
[0] => file20
)Eine reguläre Sortierung würde file20 vor file3 platzieren — was beim Auflisten von Dateien selten gewünscht ist.
natsort() unterscheidet Groß- und Kleinschreibung
natsort() vergleicht Großbuchstaben vor Kleinbuchstaben (Großbuchstaben-ASCII-Codes sind kleiner). Bei gemischter Groß- und Kleinschreibung werden Großbuchstaben daher zuerst gruppiert:
$images = array("img12", "img10", "IMG2", "img1");
natsort($images);
print_r($images);Ausgabe:
Array
(
[2] => IMG2
[3] => img1
[1] => img10
[0] => img12
)IMG2 wird vor den Namen in Kleinbuchstaben sortiert. Wenn die Groß- und Kleinschreibung ignoriert werden soll, verwenden Sie die Variante natcasesort(), die nicht zwischen Groß- und Kleinschreibung unterscheidet:
$images = array("img12", "img10", "IMG2", "img1");
natcasesort($images);
print_r($images);Ausgabe:
Array
(
[3] => img1
[2] => IMG2
[1] => img10
[0] => img12
)Einschränkungen und Besonderheiten
- Schlüssel werden beibehalten. Wenn Sie danach einen sauberen, nullbasierten Index benötigen, führen Sie
array_values($array)aus, sobald die Sortierung abgeschlossen ist. - Sortierung erfolgt direkt. Das Array wird per Referenz übergeben; schreiben Sie nicht
$x = natsort($arr)— das speichert den booleschen Rückgabewert, nicht das sortierte Array. - Standardmäßig Groß-/Kleinschreibung beachtend. Verwenden Sie
natcasesort(), wenn die Groß- und Kleinschreibung die Reihenfolge nicht beeinflussen soll. - Nur Arrays.
natsort()funktioniert nicht mit Zeichenketten oder Objekten. Um eine durch Trennzeichen getrennte Zeichenkette zu sortieren, zerlegen Sie sie mitexplode()in ein Array, sortieren Sie es und fügen Sie es mitimplode()wieder zusammen. - Paarweiser Vergleich. Intern verwendet es dieselbe Logik wie
strnatcmp(); für eine eigene Regel sortieren Sie mitusort()und einem eigenen Komparator.
Fazit
natsort() sortiert ein Array in menschenfreundlicher natürlicher Reihenfolge, behandelt eingebettete Zahlen als numerische Werte und erhält dabei die Schlüssel des Arrays. Verwenden Sie es für Dateinamen, Versionszeichenketten und alle Listen, die Text mit Zahlen mischen — wechseln Sie zu natcasesort(), wenn die Groß- und Kleinschreibung keine Rolle spielen soll, und denken Sie daran, mit array_values() neu zu indizieren, wenn Sie sequenzielle Schlüssel benötigen. Für andere Sortierbedürfnisse erkunden Sie die verwandten Array-Sortierfunktionen.