2010-07-08 50 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