Start · Sprachen · PHP · Referenz · natcasesort

natcasesort

Funktion

Sortiert ein Array nach dem natürlichen Sortieralgorithmus, wobei Groß- und Kleinschreibung ignoriert wird, und erhält die Schlüssel-Wert-Zuordnung.

seit PHP 4.0.0 Kategorie: array

Signatur

natcasesort(array &$array): true

Beschreibung

natcasesort() sortiert ein Array mithilfe des sogenannten "Natural Order"-Algorithmus, der Zahlen in Zeichenketten als numerische Werte behandelt. Im Gegensatz zur maschinellen Sortierung (sort()) würde beispielsweise img10.png korrekt nach img9.png einsortiert, anstatt davor. Dabei wird die Groß- und Kleinschreibung ignoriert, sodass A und a als gleichwertig gelten.

Die Funktion ist eine Variante von natsort(), die jedoch Groß-/Kleinschreibung berücksichtigt. Beide Funktionen arbeiten direkt auf dem übergebenen Array (Pass-by-Reference) und erhalten dabei die Zuordnung zwischen Schlüsseln und Werten – es handelt sich also um eine assoziative Sortierung. Dies ist besonders dann nützlich, wenn die ursprünglichen Schlüssel nach der Sortierung noch benötigt werden.

Typische Einsatzgebiete sind das Sortieren von Dateinamen, Versionsnummern, Produktbezeichnungen oder anderen gemischten alphanumerischen Zeichenketten, bei denen eine rein lexikographische Sortierung unerwünschte Ergebnisse liefern würde.

Da die Funktion das Array direkt modifiziert und keinen neuen Rückgabewert liefert (ab PHP 8.0 wird true zurückgegeben), wird sie typischerweise als Anweisung ohne Auswertung des Rückgabewerts eingesetzt.

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das zu sortierende Array, das per Referenz übergeben wird. Es wird direkt modifiziert.

Rückgabewert

Typ
true
Beschreibung
Gibt immer true zurück. Bis PHP 8.0 war der Rückgabewert undefiniert/nicht spezifiziert. Das Array wird direkt per Referenz verändert.

Beispiele

Sortierung von Dateinamen mit gemischter Groß-/Kleinschreibung

<?php
$dateien = [
    'Img12.png',
    'img10.png',
    'IMG2.png',
    'img1.png',
    'Img20.png',
];

natcasesort($dateien);

foreach ($dateien as $key => $datei) {
    echo "$key: $datei\n";
}
3: img1.png 2: IMG2.png 1: img10.png 0: Img12.png 4: Img20.png

Vergleich von natcasesort vs. sort bei alphanumerischen Werten

<?php
$werte = ['Version10', 'version2', 'VERSION1', 'Version20', 'version3'];

// Normale Sortierung (lexikographisch)
$kopie1 = $werte;
sort($kopie1);
echo "sort():\n";
print_r($kopie1);

// Natürliche Sortierung ohne Groß-/Kleinschreibung
$kopie2 = $werte;
natcasesort($kopie2);
echo "natcasesort():\n";
print_r($kopie2);
sort(): Array ( [0] => VERSION1 [1] => Version10 [2] => Version20 [3] => version2 [4] => version3 ) natcasesort(): Array ( [2] => VERSION1 [1] => version2 [4] => version3 [0] => Version10 [3] => Version20 )

Sortierung eines assoziativen Arrays – Schlüssel bleiben erhalten

<?php
$produkte = [
    'p3' => 'Artikel10',
    'p1' => 'artikel2',
    'p4' => 'ARTIKEL1',
    'p2' => 'Artikel20',
];

natcasesort($produkte);

foreach ($produkte as $key => $wert) {
    echo "$key => $wert\n";
}
p4 => ARTIKEL1 p1 => artikel2 p3 => Artikel10 p2 => Artikel20

// Wichtig · Fallstricke

Schlüsselerhalt: Im Gegensatz zu sort() werden bei natcasesort() die ursprünglichen Array-Schlüssel beibehalten. Soll das Array nach der Sortierung neu indiziert werden (0, 1, 2, …), muss anschließend array_values() aufgerufen werden.

Locale-Abhängigkeit: Der Vergleich basiert auf der internen PHP-Implementierung des natürlichen Sortieralgorithmus und ist nicht direkt von der aktuellen Locale abhängig. Für locale-abhängige Sortierungen sollte usort() in Kombination mit collator_compare() (aus der Intl-Extension) genutzt werden.

Typen: Enthält das Array nicht-string-Werte, werden diese zunächst in Strings umgewandelt. Das Verhalten bei gemischten Typen kann daher zu unerwarteten Ergebnissen führen.