На вопрос не так легко ответить, как кажется на первый взгляд. Это одна из областей, где отсутствие поддержки PHP в Юникоде поражает вас с полной силой.
Frist of all natsort()
, как предлагают другие авторы, не имеет ничего общего с сортировочными массивами того типа, который вы хотите отсортировать. Что вам нужно, так это механизм сортировки с учетом локали, поскольку сортировка строк с расширенными символами всегда зависит от используемого языка. Давайте возьмем, например, немецкий: A и Ä иногда можно сортировать так, как если бы они были одной и той же буквой (DIN 5007/1), а иногда Ä можно сортировать так, как это было на самом деле «AE» (DIN 5007/2). В шведском языке, напротив, Ä стоит в конце алфавита.
Если вы не используете Windows, вам повезло, поскольку PHP предоставляет некоторые функции именно для этого. Используя комбинацию setlocale()
, usort()
, strcoll()
и правильной локали UTF-8 для вашего языка, вы получите что-то вроде этого:
$array = array('Àgile', 'Ágile', 'Âgile', 'Ãgile', 'Ägile', 'Agile', 'Test');
$oldLocal = setlocale(LC_COLLATE, '<<your_RFC1766_language_code>>.utf8');
usort($array, 'strcoll');
setlocale(LC_COLLATE, $oldLocal);
Обратите внимание, что для сортировки строк UTF-8 необходимо использовать вариант локали UTF-8. Я вернул языковой стандарт в приведенном выше примере к исходному значению, так как установка языкового стандарта с помощью setlocale()
может привести к побочным эффектам в других запущенных сценариях PHP - для получения дополнительной информации см. Руководство по PHP.
Когда вы используете компьютер с Windows, в настоящее время нет решения этой проблемы, и до PHP 6, я полагаю, его не будет. Пожалуйста, посмотрите мой вопрос о том, как нацелиться на эту конкретную проблему.