Start · Sprachen · PHP · Referenz · Collator

Collator

Klasse

Vergleicht und sortiert Zeichenketten abhängig von einer bestimmten Locale nach den jeweiligen Regeln der Unicode-Collation-Algorithmen.

seit PHP 5.3.0 Kategorie: string

Signatur

class Collator

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

Typ

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;
}
Aachen ähnlich Berlin Österreich Über Zebra

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;
}
Ball Zebra Åland Äpfel Öl

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
Gleich 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));
Affe, Mond, Öl, Zebra

// Wichtig · Fallstricke

Fallstricke und Hinweise:

  • Wenn die intl-Erweiterung nicht installiert ist, ist die Klasse Collator nicht 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 Fehler null zurückgibt.
  • Die Stärke (Strength) beeinflusst, welche Unterschiede beim Vergleich berücksichtigt werden: PRIMARY ignoriert Groß-/Kleinschreibung und Diakritika, SECONDARY unterscheidet 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.