Как отсортировать значения с помощью специальных символов в массиве?
Во-первых, я установил правильную локализацию на испанский:
setlocale(LC_ALL, 'es_ES');
Этот массив содержит список языков, которые должны быть расположены в алфавитном порядке.
$lang['ar'] = 'árabe';
$lang['fr'] = 'francés';
$lang['de'] = 'alemán';
Итак, я делаю это:
asort($lang,SORT_LOCALE_STRING);
Окончательный результат:
- Alemán
- Francés
- Араб
... и так должно быть:
- Араб
- Alemán
- Francés
Функция asort() отправляет символ в конец упорядоченного списка. Как я могу избежать этой проблемы? Спасибо!
Решение связано с @Sbls
function compareASCII($a, $b) {
$at = iconv('UTF-8', 'ASCII//TRANSLIT', $a);
$bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b);
return strcmp($at, $bt);
}
uasort($lang, 'compareASCII');
3 ответа
Решение
Решение, связанное @Sbls в комментариях
function compareASCII($a, $b) {
$at = iconv('UTF-8', 'ASCII//TRANSLIT', $a);
$bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b);
return strcmp($at, $bt);
}
uasort($lang, 'compareASCII');
Попробуйте использовать Collator::asort
от intl
модуль:
<?php
$collator = collator_create('es_ES');
$collator->asort($array);
Вполне вероятно, что сравнение проверяет многобайтовое значение символа и á
в этом случае, вероятно, больше, чем z
, так это покажет потом. Если вы хотите сравнение, которое не учитывает это, я вижу две возможности:
- Сортировка с помощью uasort и создать свою собственную функцию сравнения.
- Создайте отображение из ascii-версии ваших строк в настоящую и сортируйте по ключам.