Как отсортировать значения с помощью специальных символов в массиве?

Во-первых, я установил правильную локализацию на испанский:

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, так это покажет потом. Если вы хотите сравнение, которое не учитывает это, я вижу две возможности:

  1. Сортировка с помощью uasort и создать свою собственную функцию сравнения.
  2. Создайте отображение из ascii-версии ваших строк в настоящую и сортируйте по ключам.
Другие вопросы по тегам