2012-05-18 20 views
7

我有持有西班牙語言的名稱的數組:排序有特殊字符數組在PHP

$lang["ko"] = "coreano"; //korean 
$lang["ar"] = "árabe"; //arabic 
$lang["es"] = "español"; //spanish 
$lang["fr"] = "francés"; //french 

我需要訂購陣列並保持索引關係,所以我用asort()SORT_LOCALE_STRING

setlocale(LC_ALL,'es_ES.UTF-8'); //this is at the beginning (config file) 
asort($lang,SORT_LOCALE_STRING); 
print_r($lang); 

預期產出將是這個順序:

  • 陣列([AR] => ARABE [KO] => coreano [ES] =>西班牙語[FR] =>八方資源)

然而,這是我收到什麼:

  • 陣列([KO] => coreano [ES] =>西班牙語[FR] =>八方資源[AR] => ARABE)

我缺少的東西?感謝您的反饋意見! (我的服務器使用的PHP版本5.2.13)

+0

狂猜:可能是因爲'c'在'á'之前? –

+0

這就是我使用SORT_LOCALE_STRING的原因。 'á'應該在'a'之後和'c'之前。 – andufo

+0

好吧,祝你好運:) –

回答

5

嘗試通過translitterated名稱排序:

function compareASCII($a, $b) { 
    $at = iconv('UTF-8', 'ASCII//TRANSLIT', $a); 
    $bt = iconv('UTF-8', 'ASCII//TRANSLIT', $b); 
    return strcmp($at, $bt); 
} 

uasort($lang, 'compareASCII'); 

print_r($lang); 
+0

這工作。謝謝! – andufo

+3

這可能適用於此特定情況,但它不是一個強大的通用解決方案;如果要對包含例如西裏爾字母或希臘字母字符串的數組進行排序,會發生什麼情況?ASCII音譯不是特別可靠。 –

+0

@WillVousden你是對的。無論如何,對於包含語言名稱的數組,我認爲是可以的。 –

2

您在setlocale()錯誤地定義你的語言環境。

變化:

setlocale(LC_ALL,'es_ES.UTF-8'); 

要:

setlocale(LC_ALL,'es_ES'); 

輸出:

Array ([ar] => árabe [ko] => coreano [es] => español [fr] => francés) 
+0

我也嘗試過,但它返回相同的響應:Array([ko] => coreano [es] =>español[fr] =>francés[ar] =>árabe) – andufo

+1

該區域設置爲100%文件以UTF-8編碼。在任何情況下,區域後綴和文件編碼都應該匹配。 – Jon

+0

@andufo嘗試在[phptester.net](http://phptester.net/index.php?lang=en)上運行它,它對我來說工作正常。如果是這種情況,你應該看到Jon的評論,並檢查你的文件是如何編碼的。 –

0

試試這個

setlocale(LC_COLLATE, 'nl_BE.utf8'); 
$array = array('coreano','árabe','español','francés'); 
usort($array, 'strcoll'); 
print_r($array); 
+0

抱歉,沒有工作:( – andufo

0

setlocale說明文檔中提到

不同的系統有不同的語言環境命名方案。

您的系統可能無法識別區域爲es_ES。如果您在Windows上,請嘗試使用esp_ESP

+0

沒有工作:(我的開發服務器在Mac OSX上運行。 – andufo