Signatur
Beschreibung
strcoll() vergleicht zwei Zeichenketten anhand der Regeln der aktuell gesetzten Locale (gesetzt via setlocale()). Im Gegensatz zu strcmp(), das einen rein byte-weisen Vergleich durchführt, berücksichtigt strcoll() sprachspezifische Sortierregeln – beispielsweise die korrekte Einsortierung von Umlauten (ä, ö, ü) im Deutschen oder akzentuierten Zeichen im Französischen.
Der Rückgabewert entspricht dem Muster vieler C-Vergleichsfunktionen: Ein negativer Wert bedeutet, dass $string1 kleiner (d. h. in der Sortierung früher) als $string2 ist; 0 bedeutet Gleichheit; ein positiver Wert bedeutet, dass $string1 größer ist. Die genauen Zahlenwerte sind implementierungsabhängig – nur das Vorzeichen ist relevant.
Die Funktion ist besonders sinnvoll, wenn Zeichenketten für Benutzer sichtbar sortiert werden sollen, etwa beim Sortieren von Namen, Städten oder Produktbezeichnungen in mehrsprachigen Anwendungen. Allerdings muss die gewünschte Locale vorher explizit mit setlocale() gesetzt werden, sonst verhält sich strcoll() wie ein einfacher Byte-Vergleich (Locale C).
Achtung: Die Funktion ist nicht für Multibyte-Zeichenkodierungen (z. B. UTF-8) unter allen Betriebssystemen zuverlässig. Für portable, Unicode-fähige Vergleiche sollte stattdessen Collator::compare() aus der Intl-Extension verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $string1 Pflicht | string | Die erste zu vergleichende Zeichenkette. | |
| $string2 Pflicht | string | Die zweite zu vergleichende Zeichenkette. |
Rückgabewert
$string1 kleiner als $string2 ist; 0, wenn beide Zeichenketten gleich sind; einen positiven Wert, wenn $string1 größer als $string2 ist. Die genaue Zahl ist plattformabhängig, nur das Vorzeichen ist aussagekräftig.Beispiele
Einfacher Locale-basierter Vergleich mit deutschen Umlauten
<?php
setlocale(LC_COLLATE, 'de_DE.UTF-8');
$a = 'Apfel';
$b = 'Äpfel';
$result = strcoll($a, $b);
if ($result < 0) {
echo "'$a' kommt vor '$b'";
} elseif ($result > 0) {
echo "'$a' kommt nach '$b'";
} else {
echo "'$a' und '$b' sind gleich";
}
?>
Sortierung eines Arrays mit usort() und strcoll()
<?php
setlocale(LC_COLLATE, 'de_DE.UTF-8');
$staedte = ['Zürich', 'Berlin', 'Österreich', 'Aachen', 'Übersee'];
usort($staedte, 'strcoll');
foreach ($staedte as $stadt) {
echo $stadt . PHP_EOL;
}
?>
// Wichtig · Fallstricke
Portabilität: Die Verfügbarkeit und das Verhalten von Locales ist betriebssystemabhängig. Unter Windows können Locale-Namen von Unix-Systemen abweichen (z. B. 'German_Germany.1252' statt 'de_DE.UTF-8'). Auf Systemen, auf denen die gewünschte Locale nicht installiert ist, fällt strcoll() stillschweigend auf die C-Locale zurück.
Multibyte/Unicode: Für zuverlässige Unicode-Sortierung (UTF-8) empfiehlt sich die Verwendung von Collator::compare() aus der intl-Extension, die intern ICU nutzt und unabhängig von installierten System-Locales funktioniert.
Performance: strcoll() kann langsamer sein als strcmp(), da es Locale-Tabellen konsultiert. Bei großen Datensätzen kann dies spürbar sein.