2011-04-18 15 views
10

如果我設置我的當前語言環境來日本,我怎樣才能讓這個日文字符將總是比非日語字符更高的優先級。例如,現在英文字符總是出現在片假名字符之前。我怎樣才能扭轉這種影響?排序()日本

對不起,我不是很清楚。正如你可以看到here

最終結果具備Java,NVIDIA和Windowsファイアウォール。 排名前三的日本人物。最後可能會有這些嗎?

+0

沒有看到。你確定安裝了正確的語言環境嗎? '$ LC_COLLATE = ja_JP sort <<<''kawa \ nかわ\ nカワ\ n川'' 'かわ' 'カワ' 'kawa' '川' – 2011-04-18 03:33:01

回答

6

使用usort()而不是sort(),所以你可以定義你自己的方式比較標準。

試試這個簡單的方法。我已經用here的例子嘗試過了,它可以工作。

function mccompare($a, $b) { 
    $fca = ord(substr($a, 0, 1)); $fcb = ord(substr($b, 0, 1)); 
    if (($fca >= 127 && $fcb >= 127) || ($fca < 127 && $fcb < 127)) 
     $res = $a > $b ? 1 : -1; 
    else 
     $res = $a > $b ? -1 : 1; 
    return $res; 
    } 

    usort ($your_array, "mccompare"); 

所以在這個例子中

setlocale(LC_COLLATE, "jpn"); 

    $your_array = array ("システム", "畫面", "Windows ファイウォール", 
     "インターネット オプション", "キーボード", "メール", "音聲認識", "管理ツール", 
     "自動更新", "日付と時刻", "タスク", "プログラムの追加と削除", "フォント", 
     "電源オプション", "マウス", "地域と言語オプション", "電話とモデムのオプション", 
     "Java", "NVIDIA"); 

    usort ($your_array, "mccompare"); 
    print_r($your_array); 

返回數組像

Array 
(
    [0] => インターネット オプション 
    [1] => キーボード 
    [2] => システム 
    [3] => タスク 
    [4] => フォント 
    [5] => プログラムの追加と削除 
    [6] => マウス 
    [7] => メール 
    [8] => 地域と言語オプション 
    [9] => 日付と時刻 
    [10] => 畫面 
    [11] => 管理ツール 
    [12] => 自動更新 
    [13] => 電源オプション 
    [14] => 電話とモデムのオプション 
    [15] => 音聲認識 
    [16] => Java 
    [17] => NVIDIA 
    [18] => Windows ファイウォール 
) 

注:這只是我對這個問題的快速解決方案,它不是一個完美的解決方案。它基於檢查字符串比較中的第一個字節,但是你總是可以通過檢查第一個字節並改進此功能來檢查所有的多字節字符與Unicode,然後決定$ a < = $ b或$ a> $ b。

希望它適合你!

2

最終,PHP的sort()離開到底層的libc實現排序。如文章和我的評論所示,並非所有的libcs​​都以相同的方式排序。如果您需要提供一致的排序規則,那麼您需要使用諸如Collator之類的內容,而不是使用第三方庫。