区域设置感知字符串比较

时间:2010-07-08 13:38:31

标签: php localization string-comparison sorting

我将strcmpusort结合使用,以便对国家/地区名称数组进行排序。目前,排序顺序为:

Belgien
Frankreich
Italien
Luxemburg
Niederlande
Spanien
United Kingdom
Österreich

Österreich的位置外,这是正确的。它应该在NiederlandeSpanien之间。

我还尝试了strnatcmpstrcoll(使用setlocale),但排序顺序不是我想要的方式。结果不是来自mysql db,因此不能通过mysql查询进行排序。

2 个答案:

答案 0 :(得分:5)

老问题,同时我在另一家公司的另一个项目上工作,但最近遇到了同样的问题。最终工作的是为PHP安装intl extension

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
)

答案 1 :(得分:0)

这有效(假设脚本是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