如何在数组中使用特殊字符对值进行排序?

时间:2014-01-04 18:14:25

标签: php asort

首先,我将正确的语言环境设置为西班牙语:

setlocale(LC_ALL, 'es_ES');

此数组包含必须按字母顺序重新排序的语言列表。

$lang['ar'] = 'árabe';
$lang['fr'] = 'francés';
$lang['de'] = 'alemán';

所以我这样做:

asort($lang,SORT_LOCALE_STRING);

最终结果是:

  • 阿莱曼
  • 八方资源
  • ARABE

......它应该是:

  • ARABE
  • 阿莱曼
  • 八方资源

asort()函数将á字符发送到有序列表的底部。我该如何避免这个问题?谢谢!

@Sbls的

解决方案 linked

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 个答案:

答案 0 :(得分:0)

比较可能会检查字符的多字节值,在这种情况下á可能大于z,因此它会在之后显示。如果你想要一个没有考虑到这一点的比较,我会看到两个可能性:

  1. 使用uasort排序并创建自己的比较功能。
  2. 生成从字符串的ascii版本到真实字符串的映射,并对键进行排序。

答案 1 :(得分:0)

尝试使用intl模块中的Collator::asort

<?php
$collator = collator_create('es_ES');
$collator->asort($array);

答案 2 :(得分:0)

@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');