代码之家  ›  专栏  ›  技术社区  ›  BMBM

区域设置感知字符串比较

  •  2
  • BMBM  · 技术社区  · 14 年前

    我正在使用 strcmp usort 以便对国家名称数组进行排序。目前,排序顺序为:

    Belgien
    Frankreich
    Italien
    Luxemburg
    Niederlande
    Spanien
    United Kingdom
    Österreich
    

    哪一个是正确的,除了 Österreich . 应该在 Niederlande Spanien .

    strnatcmp strcoll (与 setlocale ),但排序顺序不是我想要的。结果不是来自mysql数据库,因此不能通过mysql查询进行排序。

    2 回复  |  直到 14 年前
        1
  •  5
  •   BMBM    13 年前

    老问题,同时我在另一家公司做另一个项目,但最近面临同样的问题。最后成功的是安装 intl extension 对于PHP。

    sudo apt-get install php5-intl
    

    然后使用:

    $arr = array(
    "Belgien",
    "Frankreich",
    "Italien",
    "Luxemburg",
    "Niederlande",
    "United Kingdom",
    "Österreich",
    "Spanien",
    "Ásdf",
    );
    
    $coll = collator_create('de_DE');
    $coll->sort($arr);
    print_r($arr);
    

    按预期顺序返回结果:

    Array
    (
        [0] => Ásdf
        [1] => Belgien
        [2] => Frankreich
        [3] => Italien
        [4] => Luxemburg
        [5] => Niederlande
        [6] => Österreich
        [7] => Spanien
        [8] => United Kingdom
    )
    
        2
  •  0
  •   Artefacto    14 年前

    这是可行的(假设脚本是UTF-8):

    <?php
    
    $arr = array(
    "Belgien",
    "Frankreich",
    "Italien",
    "Luxemburg",
    "Niederlande",
    "United Kingdom",
    "Österreich",
    "Spanien",
    "Ásdf",
    );
    
    setlocale(LC_COLLATE, "pt_PT.UTF8");
    usort($arr, 'strcoll');
    print_r($arr);
    

    给了我:

    Array
    (
        [0] => Ásdf
        [1] => Belgien
        [2] => Frankreich
        [3] => Italien
        [4] => Luxemburg
        [5] => Niederlande
        [6] => Österreich
        [7] => Spanien
        [8] => United Kingdom
    )
    

    然而,这是痛苦的;它需要安装区域设置。 locale -a

    C
    en_US
    en_US.iso88591
    en_US.utf8
    POSIX
    pt_PT.utf8