【问题标题】:How to sort values with special chars in array?如何对数组中具有特殊字符的值进行排序?
【发布时间】:2014-01-22 08:52:45
【问题描述】:

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

setlocale(LC_ALL, 'es_ES');

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

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

所以我这样做:

asort($lang,SORT_LOCALE_STRING);

最终结果是:

  • 阿莱曼
  • 弗朗西斯
  • árabe

...应该是:

  • árabe
  • 阿莱曼
  • 弗朗西斯

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

解决方案 linked @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');

【问题讨论】:

  • ksort 不适合你吗?我对键而不是值进行排序。
  • @Sbls 这对我来说是行不通的。我有几个语言包,键总是保持不变,但值不会。我总是需要按价值订购。
  • stackoverflow.com/questions/10649473/… 的可能重复项您可以使用该问题线程吗?
  • 我看到的一件事是,您正在设置$lang 的值,但对$list['translate'] 进行排序,是同一个数组吗?
  • AlexSiri:它根本不会排序。也许是一个错字。 @andufo:不过,整件事对我有用。好吧,对我来说,阿拉贝在阿莱曼之后。但它不会最后出现。

标签: php asort


【解决方案1】:

很可能是比较检查了字符的多字节值,这种情况下á可能大于z,所以后面会显示。如果您想要一个不考虑这一点的比较,我看到了两种可能性:

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

【讨论】:

    【解决方案2】:

    尝试使用来自intl 模块的Collator::asort

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

    【讨论】:

      【解决方案3】:

      在 cmets 中由 @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');
      

      【讨论】:

        猜你喜欢
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 2017-05-28
        • 2021-07-26
        • 1970-01-01
        • 2011-02-23
        • 2021-10-28
        相关资源
        最近更新 更多