Sortierung von PHP-Arrays

Die umfangreichen Sortier-Funktionen von PHP

Eine der häufigsten Arbeiten mit Arrays ist die Sortierung. Auf dieser Seite finden sie einige Hinweise zur Sortierung mit PHP.
PHP PHP Hypertext Processor, PHP-Arrays
Array-Typen Schlüssel, Indizierte und assoziative Arrays
Sortieren Konstanten, Funktionen, Möglichkeiten
Verwandte Themen Arrays sortieren in Javascript, Perl

Array-Typen:   Indiziert oder assoziativ

Schlüssel (key)

PHP verwendet zur Kennzeichnung der Elemente eines Arrays Schlüssel (keys).
Als Schlüssel sind entweder ganze Zahlen oder Worte (Text, string) zulässig.
Jedes einzelne Element jedes Arrays speichert daher 2 Daten: Den Schlüssel und den Wert.
Das ermöglicht die Verwendung 'klassischer' Index-Zahlen (0,1,2, ..) ebenso wie von Worten ("Vorname","Zuname", ..) für die Bezeichnung bestimmter Elemente eines Arrays.

Ganze Zahlen

Wenn ganze Zahlen als Schlüssel eingesetzt werden, dann wird meist der Begriff Index dafür verwendet.

Text (string)

Wenn Texte (Worte, strings) als Schlüssel eingesetzt werden, dann verwendet man meist den Begriff assoziatives Array.

Intern macht PHP keinen Unterschied zwischen diesen Typen, man kann sie daher sogar miteinander mischen.
Ganze Zahlen (auch negative) können als Schlüssel (Index) im Bereich -231..+231-1 verwendet werden. Überschreitung dieser Grenzen liefert keine Fehlermeldung !

Strings (Texte) können als assoziative Schlüssel verwendet werden. Sie dürfen auch Leerzeichen oder Sonderzeichen enthalten, empfohlen werden jedoch nur einfache Worte.

Ganze Zahlen und Strings können 'gemischt' als Schlüssel verwendet werden, das wird allerdings bald unübersichtlich und daher nicht empfohlen.

// Ganze Zahlen:
$ary[0] = 1;
$ary[-2147483648] = 1; // min
$ary[2147483647] = 1; // max

// Strings:
$ary['vorname']='Franz';
$ary['%2 oder 3;']="neue\nZeile";

Sortierung von Arrays

Sortier-Konstanten

PHP definiert einige Konstanten zur Steuerung der Sortierung.
Details zu Globalen PHP-Konstanten.

SORT_REGULAR ↔ 'Normale' Sortierung (Standardwert)
Reihenfolge: NULL, negative Zahlen, Text (A..Z a..z ), positive Zahlen

SORT_NUMERIC ↔ Numerische Sortierung
Reihenfolge: negative Zahlen, Text oder NULL, positive Zahlen
Wichtig: NULL wird wie 0 sortiert !
Die Text-Sortierung ist unbestimmt, scheint jedoch in Gruppen a..z, NULL, A..Z zu sortieren, die selbst ungeordnet sind.

SORT_STRING ↔ Alphabetische Sortierung
Reihenfolge: NULL, 0..9 A..Z a..z
Achtung: Zahlen werden wie Ziffern-Strings sortiert, z.B. 1,12,123,2,23,234,3, ...

Für komplizierte Fälle kann man eigene Sortier-Funktionen (usort() ) erstellen.

Schlüssel

Beachten sie beim Sortieren das Verhalten der Schlüssel:
Einige Funktionen bewahren ausdrücklich die Schlüssel und ihre Zuordnung zu Werten, andere vergeben neue Schlüssel !

Speicherplatz

Das zu sortierende Array wird immer als Argument an die Sortier-Funktion übergeben und direkt bearbeitet, d.h. nicht zurückgegeben. Daher benötigt die Sortierung keinen zusätzlichen Speicherplatz.
Details zur Übergabe von Arrays an Funktionen).
Die Sortierfunktionen liefern zwar ein Ergebnis (true / false), das aber normalerweise nicht verwendet wird.
Wenn sie unabhängig von der Sortierung den Original-Zustand des Arrays erhalten wollen, dann müssen sie vorher eine → Kopie anfertigen.

Umkehr-Funktionen

Zu den meisten Sortier-Funktionen gibt es die analoge Umkehr-Funktion. Die beiden zusammengehörenden Funktionen werden hier in nebeneinander liegenden Absätzen vorgestellt. Diese Funktionen arbeiten alle direkt mit dem Original-Array, benötigen daher keinen zusätzlichen Speicherplatz.
Einzige Ausnahme ist Funktion array_reverse() (s.u.), die eine komplette Kopie mit umgekehrter Sortierung erzeugt.

Test-Array

Zur Demonstration der verschiedenen Sortier-Funktionen wird dieses Array verwendet:
$ary = array(0,'a',NULL,1,'A',' ',-1);
shuffle($ary);

Funktion sort()

Sortiert ein Array aufsteigend nach Werten, löscht alle bestehenden Schlüssel und vergibt neue ganzzahlige Schlüssel [0],[1],[2],..
Ohne Angabe einer Sortier-Konstanten wird SORT_REGULAR verwendet
sort($ary);
sort($ary,SORT_NUMERIC);
sort($ary,SORT_STRING);

Funktion rsort()

Sortiert ein Array absteigend nach Werten, löscht alle bestehenden Schlüssel und vergibt neue ganzzahlige Schlüssel [0],[1],[2],..
rsort($ary);
Übersicht zu den Funktionen sort() und rsort() (ohne Gewähr): So werden Zahlen, Texte und unbekannte (leere) Array-Elemente sortiert:
FunktionReihenfolge nach Sortierung
sort($a)NULL,0-1NULL,0,' ','a','A'1
sort($a,SORT_NUMERIC)-1NULL,0,' ','a','A'1
sort($a,SORT_STRING)NULL' '-101'A''a'
usort()beliebig programmierbar
rsort($a)10,' ','a','A'-1NULL
rsort($a,SORT_NUMERIC)1NULL,0,' ','a','A'-1
rsort($a,SORT_STRING)'a''A'10-1' 'NULL
shuffle()zufällig
Hinweise: NULL ist ein undefinierter oder leerer Wert, die Zahlen (-1,0,1) repräsentieren numerische Werte, die Zeichen (' ','A','a') repräsentieren Texte (Strings), ' ' ein Leerzeichen. Mehrere Einträge in einer Zelle bedeuten, dass die Position innerhalb der Gruppe nicht sortiert wird und daher nicht vorhersagbar ist.

Funktion asort()

Sortiert ein Array aufsteigend nach Werten und bewahrt dabei alle Schlüssel.
asort($ary);

Funktion arsort()

Sortiert ein Array absteigend nach Werten und bewahrt dabei alle Schlüssel.
arsort($ary);

Funktion natsort()

Sortiert ein Array nach einem 'natürlichen' Algorithmus. Gut geeignet für Texte, die aus einem fixen String und einer Zahl kombiniert sind:
Sortiert z.B. 'p1','p2','p10','p20',..
natsort($ary);

Funktion natcasesort()

Sortiert ein Array genauso wie natsort(), jedoch unabhängig von Groß- und Kleinbuchstaben, z.B. 'p1','P2','p10','P20',..
natcasesort($ary);

Funktion ksort()

Sortiert ein Array aufsteigend nach Schlüsseln und bewahrt dabei alle Zuordnungen zwischen Schlüsseln und Werten. Das ergibt nur mit Text-Schlüsseln einen Sinn.
ksort($ary);

Funktion krsort()

Sortiert ein Array absteigend nach Schlüsseln und bewahrt dabei alle Zuordnungen zwischen Schlüsseln und Werten.
krsort($ary);

Funktion usort()

Sortiert ein Array nach einer eigenen (User)-Hilfsfunktion.
usort($ary,'mycmp');
Das zweite Argument bezeichnet eine eigene Hilfs-Funktion zur Steuerung der Sortierung.
Die Hilfsfunktion erhält je 2 zu vergleichende Elemente des Arrays und sollte {-1,0,1} zurückgeben, wenn {$a<$b, $a==$b, $a>$b}
Das Beispiel rechts zeigt ein Muster, welches Kleinbuchstaben < Großbuchstaben < Ziffern sortiert. Dazu wird eine weitere Hilfsfunktion xord() (Modifikation von ord() ) verwendet.
Die Umkehrung dieser Funktion müssen sie selbst programmieren - z.B. durch Vertauschen der beiden Zuweisungen $cmp=-1; und $cmp=1;

Funktion uasort()

Sortiert ein Array nach einer eigenen (User)-Hilfsfunktion und bewahrt dabei alle Schlüssel.
uasort($ary,'mycmp');
Beispiel für eine Sortier - Hilfsfunktion:
function mycmp($a,$b) {
$cmp=0; $i=0;
while(!$cmp && $i<strlen($a) && $i<strlen($b)) {
$ca=xord(substr($a,$i,1));
$cb=xord(substr($b,$i,1));
if($ca<$cb) {$cmp=-1;}
elseif($ca>$cb) {$cmp=1;}
$i++;
}
return $cmp;
}
function xord($a) {
$c=ord($a);
if($c<65) {$c+=4*16;}
elseif($c>90) {$c-=5*16;}
return $c;
}

Funktion array_reverse()

Gibt ein neues Array mit umgekehrter Reihenfolge der Elemente zurück.
$ra = array_reverse($ary);

Ausnahme: Diese Funktion ändert das Original-Array nicht !
Durch Herstellung der Kopie wird der Speicher-Bedarf verdoppelt !

Funktion shuffle()

Mischt die Elemente eines Arrays, löscht alle bestehenden Schlüssel und vergibt neue ganzzahlige Schlüssel [0],[1],[2],..
shuffle($ary);

Das Ergebnis des Mischens ist normalerweise nicht vorhersagbar, da es mit jeweils anderen Zufallszahlen berechnet wird. Allerdings kann man bestimmte Zufallsfolgen bei Bedarf auch reproduzieren (exakt wiederholen).
Details unter Zufall @ PHP.