2010-07-08 56 views
2

我正在使用strcmpusort组合来排序国家/地区名称数组。目前,排序顺序为:区域感知字符串比较

Belgien 
Frankreich 
Italien 
Luxemburg 
Niederlande 
Spanien 
United Kingdom 
Österreich 

哪一个是正确的,除了Österreich的位置。它应该在NiederlandeSpanien之间。

我也试过strnatcmpstrcoll(与setlocale),但排序顺序不是我想要的方式。结果不是来自mysql数据库,所以通过mysql查询进行排序不是一种选择。

回答

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 
) 
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 
+0

我想你的代码的setlocale(LC_COLLATE, “de_DE.UTF8”);,但它不会按照正确的顺序排序数组,尽管我证实了区域设置是可用的。 – Max 2010-07-08 14:19:58

+0

@Max也许你的脚本不是UTF-8。试试de_DE.iso88591 – Artefacto 2010-07-08 15:24:15