Signatur
Beschreibung
collator_get_sort_key() erzeugt einen binären Sortierschlüssel für den übergebenen String auf Basis der Sortierregeln des Collator-Objekts. Dieser Schlüssel kann direkt mit strcmp() oder ähnlichen Byte-Vergleichsfunktionen verglichen werden und liefert dabei dasselbe Ergebnis wie ein vollständiger ICU-Collation-Vergleich – jedoch mit deutlich geringerem Aufwand bei wiederholtem Vergleichen desselben Strings.
Die Funktion ist besonders nützlich, wenn eine große Menge von Strings nach locale-spezifischen Regeln sortiert werden soll und die Strings vorberechnet in einer Datenbank oder einem Cache gespeichert werden können. Anstatt jeden Vergleich mit collator_compare() durchzuführen, werden die Schlüssel einmalig generiert und anschließend mit Standard-Bytevergleichen sortiert.
Die zurückgegebenen Sortierschlüssel sind Binärstrings und können Null-Bytes enthalten. Sie sollten daher nicht als normale Strings behandelt oder angezeigt werden. Ihre Länge und Zusammensetzung hängen von der Locale und den Collator-Einstellungen ab.
In der objektorientierten Variante steht die Methode Collator::getSortKey() zur Verfügung und verhält sich identisch.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $object Pflicht | Collator | Eine Collator-Instanz, die die locale-spezifischen Sortierregeln enthält. |
|
| $string Pflicht | string | Der Eingabestring, für den der Sortierschlüssel berechnet werden soll. |
Rückgabewert
false zurückgegeben.Beispiele
Locale-korrekte Vorsortierung von Strings
<?php
// Collator für Deutsch erstellen
$collator = collator_create('de_DE');
$woerter = ['Österreich', 'Aachen', 'Übung', 'Zug', 'ähnlich'];
// Sortierschlüssel vorberechnen
$schluessel = [];
foreach ($woerter as $wort) {
$schluessel[$wort] = collator_get_sort_key($collator, $wort);
}
// Anhand der Schlüssel sortieren (Bytevergleich)
asort($schluessel);
foreach (array_keys($schluessel) as $sortiert) {
echo $sortiert . PHP_EOL;
}
Sortierschlüssel für Datenbankindizierung generieren
<?php
$collator = collator_create('sv_SE'); // Schwedisch
$namen = ['Åke', 'Björn', 'Anders', 'Örjan'];
$eintraege = [];
foreach ($namen as $name) {
$key = collator_get_sort_key($collator, $name);
if ($key === false) {
echo "Fehler beim Generieren des Schlüssels für: $name" . PHP_EOL;
continue;
}
// Schlüssel als Hex speichern (da binär)
$eintraege[] = [
'name' => $name,
'sort_key' => bin2hex($key),
];
}
// Nach sort_key sortieren (Bytevergleich entspricht Collation-Vergleich)
usort($eintraege, fn($a, $b) => strcmp($a['sort_key'], $b['sort_key']));
foreach ($eintraege as $e) {
echo $e['name'] . PHP_EOL;
}
// Wichtig · Fallstricke
Binäre Ausgabe: Der zurückgegebene Sortierschlüssel ist ein Binärstring und kann Null-Bytes (\0) enthalten. Er ist nicht für die Anzeige geeignet und sollte nicht als regulärer Text behandelt werden. Für die Speicherung empfiehlt sich bin2hex() oder eine Blob-Spalte in der Datenbank.
Locale-Abhängigkeit: Sortierschlüssel sind nur innerhalb derselben Locale und denselben Collator-Einstellungen miteinander vergleichbar. Schlüssel aus verschiedenen Locales dürfen nicht direkt verglichen werden.
Performance: Die Vorberechnung von Sortierschlüsseln lohnt sich vor allem dann, wenn dieselben Strings häufig verglichen werden. Für einmalige Vergleiche ist collator_compare() einfacher.