Sven Rautenberg: Sortierung mit Usort, deutsche Sonderzeichen

Beitrag lesen

Moin!

Wenn du usort verwendest, musst du ja auch irgendeine Vergleichsfunktion haben …?

Autsch! Natürlich, ich habe es mit strcmp und strcol versucht.

strcmp benutzt nur einen Byte-Vergleich, keinen Zeichenvergleich, d.h. das Encoding der Strings zerreißt dir jegliche lexikalische Sortierreihenfolge (wobei angeblich laut Userkommentar auf php.net eventuell doch die eingestellte Locale benutzt wird).

Bei strcoll hätte ich trotzdem Angst um das Ergebnis.

Das lexikalische Sortieren ist keine simple Angelegenheit. Mit einer schlichten Vergleichsfunktion ist es nicht getan, denn im deutschen Sprachraum gibt es mindestens drei Sortierreihenfolgemöglichkeiten, von denen man sich irgendwie eine aussuchen können muss:

1. "Normales" Sortieren auf ASCII- bzw. Unicode-Codepoint-Basis:
    A B C ... Z [ / ] ... Ä Ö Ü
2. Sortieren nach DIN 5007-1
   A=Ä B C ... O=Ö ... U=Ü X Y Z
3. Sortieren nach DIN 5007-2
   A Ä=AE B C ... O Ö=OE ... U Ü=UE ... X Y Z

Es gibt außerdem eine große rote Warnung vor dem unbedachten Einsatz von setlocale() in der Doku:

The locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server API like IIS or Apache on Windows, you may experience sudden changes in locale settings while a script is running, though the script itself never called setlocale(). This happens due to other scripts running in different threads of the same process at the same time, changing the process-wide locale using setlocale().

- Sven Rautenberg