У меня есть массив, ключи которого являются словами на португальском языке, и я пытаюсь сортировать ключи без учета акцентов.
У меня есть следующий код, но он не работает.
$array = array('ábaco' => 1,
'aéreo' => 2,
'abecedário' => 3,
'andar' => 4,
'absurdo' => 5);
$locale = ( defined('PHP_OS') &&
stristr(PHP_OS, 'win') &&
!stristr(PHP_OS, 'darwin')) ? 'Portuguese_Brazil.1252' : 'pt_BR.UTF-8';
setlocale(LC_COLLATE, $locale);
var_dump($locale);
ksort($array, SORT_LOCALE_STRING);
var_dump($array);
Результат следующий:
string 'pt_BR.UTF-8' (length=11)
array (size=5)
'abecedário' => int 3
'absurdo' => int 5
'andar' => int 4
'aéreo' => int 2
'ábaco' => int 1
Например, слово «бако» должно быть первым, но последнее из-за его первой буквы «а».
Я запускаю этот скрипт на Mac с PHP 5.4.
Эта проблема, кажется, отличается от описанной в этом вопросе: PHP ksort не зависит от setlocale
Попробовав несколько вариантов, мне не удалось заставить ksort соблюдать правила сортировки.
Я прекратил использовать uksort и создал собственную функцию сравнения, как показано ниже.
function stripAccents($str) {
return strtr(
utf8_decode($str),
utf8_decode('àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'),
'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
}
function compareWords($w1, $w2){
return strcasecmp(stripAccents($w1), stripAccents($w2));
}
uksort($array, "compareWords");
Функция stripAccents была заимствована из этого ответа: https://stackoverflow.com/a/11743977/726142
Других решений пока нет …