Signatur
Beschreibung
Die Klasse Collator ist Teil der intl-Erweiterung und ermöglicht den Vergleich und die Sortierung von Zeichenketten unter Berücksichtigung sprachspezifischer Regeln (Locale-abhängige Collation). Sie basiert auf dem Unicode Collation Algorithm (UCA) und nutzt die ICU-Bibliothek.
Ohne Collator würde PHP Zeichenketten rein bytewise vergleichen, was für viele Sprachen falsche Sortierungen erzeugt — z. B. werden im Deutschen Umlaute (ä, ö, ü) nicht korrekt eingeordnet. Mit Collator lassen sich Sortierungen für beliebige Sprachen korrekt abbilden, inklusive Groß-/Kleinschreibung, Diakritika und sprachspezifischer Sonderregeln.
Typische Anwendungsfälle sind das Sortieren von Benutzernamen-Listen, Produktnamen oder anderen Textinhalten, die in der Oberfläche für Endbenutzer in einer bestimmten Sprache angezeigt werden. Die Klasse bietet Methoden zum direkten Vergleich (compare()), zur Array-Sortierung (sort(), asort()) und zur Erzeugung von Sortierschlüsseln (getSortKey()).
Wichtig: Die intl-Erweiterung muss aktiviert sein (üblicherweise in der php.ini über extension=intl).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $locale Pflicht | string | BCP-47-Locale-Bezeichner, z. B. 'de_DE', 'en_US' oder 'sv'. Bestimmt die Sprach- und Sortierregeln des Collators. Bei einem leeren String oder 'root' werden Unicode-Standardregeln verwendet. |
Rückgabewert
Beispiele
Grundlegende deutsche Sortierung mit usort()
<?php
$collator = new Collator('de_DE');
$namen = ['Österreich', 'Aachen', 'Über', 'Berlin', 'ähnlich', 'Zebra'];
usort($namen, function (string $a, string $b) use ($collator): int {
return $collator->compare($a, $b);
});
foreach ($namen as $name) {
echo $name . PHP_EOL;
}
Array direkt mit Collator::sort() sortieren
<?php
$collator = new Collator('sv'); // Schwedisch: Å, Ä, Ö kommen nach Z
$woerter = ['Öl', 'Zebra', 'Åland', 'Ball', 'Äpfel'];
$collator->sort($woerter);
foreach ($woerter as $wort) {
echo $wort . PHP_EOL;
}
Sortierstärke (Strength) einstellen — Groß-/Kleinschreibung ignorieren
<?php
$collator = new Collator('de_DE');
$collator->setStrength(Collator::SECONDARY); // Ignoriert Groß-/Kleinschreibung
$result = $collator->compare('Apfel', 'apfel');
echo $result === 0 ? 'Gleich' : 'Unterschiedlich';
// Ausgabe: Gleich
$collator->setStrength(Collator::TERTIARY); // Standard: Case wird unterschieden
$result = $collator->compare('Apfel', 'apfel');
echo PHP_EOL . ($result === 0 ? 'Gleich' : 'Unterschiedlich');
// Ausgabe: Unterschiedlich
Sortierschlüssel für Datenbankindizierung generieren
<?php
$collator = new Collator('de_DE');
$woerter = ['Zebra', 'Affe', 'Öl', 'Mond'];
$schluessel = [];
foreach ($woerter as $wort) {
$schluessel[$wort] = $collator->getSortKey($wort);
}
asort($schluessel);
echo implode(', ', array_keys($schluessel));
// Wichtig · Fallstricke
Fallstricke und Hinweise:
- Wenn die
intl-Erweiterung nicht installiert ist, ist die KlasseCollatornicht verfügbar und jeder Versuch, sie zu verwenden, führt zu einem fatalen Fehler. - Bei ungültigem Locale-String gibt der Konstruktor kein Exception aus, sondern erzeugt ein Objekt im Fehlerzustand. Mit
Collator::create()(statische Factory-Methode) lässt sich das besser kontrollieren, da sie bei Fehlernullzurückgibt. - Die Stärke (Strength) beeinflusst, welche Unterschiede beim Vergleich berücksichtigt werden:
PRIMARYignoriert Groß-/Kleinschreibung und Diakritika,SECONDARYunterscheidet Diakritika,TERTIARY(Standard) unterscheidet auch Groß-/Kleinschreibung. - Für sehr häufig ausgeführte Sortierungen empfiehlt sich die Verwendung von
getSortKey(), um den Sortierschlüssel vorab zu berechnen und zu cachen, da der direkte Vergleich bei großen Datensätzen langsamer ist. - Die Locale-Angaben folgen dem BCP-47-Standard. Subtag-Erweiterungen wie
'de_DE@collation=phonebook'sind möglich, um z. B. das deutsche Telefonbuch-Collation-Schema zu nutzen.