【问题标题】:Sorting PHP array with locale setting?使用区域设置对 PHP 数组进行排序?
【发布时间】:2017-08-29 22:43:33
【问题描述】:

是否可以使用区域设置对 PHP 数组进行排序?

这是设置:

我正在用 PHP 制作一个交互式排序列表。通过用户输入,可以使多个类别(列)之一来指导排序(姓名、住所等)。这是我通过使用array_multisort() 函数解决的。

下一个障碍。该列表使用瑞典语,用户将期望瑞典语字母顺序:abcdefghijklmnopqrstuvxyzåäö。现在,解释器将 åäö 分类为非字母并将它们放在“a”之前。如何补救?

我在 setlocale(LC_COLLATE, "sv_SV") 函数上发现了一些零散的信息,但评论并不热烈,我无法理解它如何与 array_multisort() 一起使用。它可以?如果是这样,如何? php中还有其他方法吗?

问题是,必须有某种方式 - 瑞典网站比比皆是应用瑞典排序顺序。用php能做到吗?

【问题讨论】:

    标签: php setlocale array-multisort


    【解决方案1】:

    使用collator_sortcollator_asort

    // sorting properly accented "Č" in Czech language (should come after "C" and before "D")
    
    // 1) Simple sort:
    $array = ['bca', 'čaz', 'cba', 'abc', 'daz'];
    $collator = collator_create('cs-CZ');
    collator_sort($collator, $array);
    // result:
    // ['abc', 'bca', 'cba', 'čaz', 'daz']
    
    // 2) Maintain index assotiations:
    $array = [
        'x' => 'Česko',
        'y' => 'Dänmark',
        'z' => 'Brunei',
        'w' => 'Cyprus'
    ];
    $coll = collator_create('sk'); // set Slovak locale (or sk-SK)
    collator_asort($coll, $array);
    
    /* result:
    $array = [
        'z' => 'Brunei',
        'w' => 'Cyprus',
        'x' => 'Česko',
        'y' => 'Dänmark',
    ];
    */
    

    【讨论】:

    • 完美,非常感谢!这就像一个魅力。
    【解决方案2】:

    使用SORT_LOCALE_STRING作为array_multisort()函数的第三个参数。 PHP文件说:

    SORT_LOCALE_STRING - 根据当前语言环境将项目作为字符串进行比较。它使用语言环境,可以使用 setlocale() 进行更改

    示例:

    $result=array_multisort( $input_array, SORT_ASC, SORT_LOCALE_STRING);
    

    【讨论】:

      【解决方案3】:

      对不起。这不是我认为的问题。用我的代码编写的文本排序正确(只是 ä 在 å 之前排序不正确,但这似乎是规范中的一个错误(?))。

      无论如何,问题显然出在字符编码上。当从 Contact Form 7 数据库(Wordpress 插件)中获取文本时,就会出现问题。大概它有另一种编码,需要转换。

      还是谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        相关资源
        最近更新 更多