Если под «специальными символами» вы подразумеваете символы, указывающие c на конкретный язык, я предлагаю использовать Collator
из пакета расширений intl
.
Например, для Poli sh стандарт sort
из:
$array = [ 'a', 'ą', 'b', 'z' ];
даст вам:
array(4) {
[0] =>
string(1) "a"
[1] =>
string(1) "b"
[2] =>
string(1) "z"
[3] =>
string(2) "ą"
}
при сортировке с использованием Collator правильный:
$collator = new Collator('pl_PL');
$collator->sort($array);
дает правильное значение:
array(4) {
[0] =>
string(1) "a"
[1] =>
string(2) "ą"
[2] =>
string(1) "b"
[3] =>
string(1) "z"
}
Если вы не можете использовать pecl intl
, но, используя PHP> = 7.0.0, вы можете использовать эту библиотеку: https://github.com/voku/portable-utf8
например:
$array = [ 'a', 'ą', 'b', 'z' ];
function mysort($a, $b) {
return UTF8::strcmp($a, $b);
}
use voku\helper\UTF8;
usort($array, 'mysort');
Не требует установки mbstring или intl (хотя и предлагает это).
Вы не должны полагаться на setlocale
, поскольку оно основано на региональных настройках, установленных в конкретной системе, и они могут не только не устанавливаться, но и их имена могут различаться (между Windows и * nix, но также и между * nixes).