13

スペイン語で言語の名前を保持する配列があります。

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

配列を並べ替え、インデックスの関連付けを維持する必要があるため、SORT_LOCALE_STRING で asort() を使用ます

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] => español [fr] => frances )

ただし、これは私が受け取っているものです:

  • 配列 ( [ko] => coreano [es] => español [fr] => francés [ar] => arabe )

何か不足していますか?ご意見ありがとうございます!(私のサーバーは PHP バージョン 5.2.13 を使用しています)

4

5 に答える 5

15

並べ替えられた名前で並べ替えてみてください。

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);
于 2012-05-18T08:54:22.583 に答える
1

でロケールを誤って定義しましたsetlocale()

変化する:

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

に:

setlocale(LC_ALL,'es_ES');

出力:

Array ( [ar] => árabe [ko] => coreano [es] => español [fr] => francés ) 
于 2012-05-18T08:55:48.513 に答える
1

setlocale言及のためのドキュメント

システムが異なれば、ロケールの命名方式も異なります。

システムがロケールを として認識しない可能性がありますes_ES。Windows を使用している場合は、esp_ESP代わりに試してください。

于 2012-05-18T09:15:24.897 に答える
0

これを試して

setlocale(LC_COLLATE, 'nl_BE.utf8');
$array = array('coreano','árabe','español','francés');
usort($array, 'strcoll'); 
print_r($array);
于 2012-05-18T08:59:17.490 に答える
0

これは問題ありません。

最初のソリューションは期待どおりに機能します。問題は、ロケールの設定に失敗しているsetlocale関数であり、その結果、asort($array, SORT_LOCALE_STRING)期待どおりにソートできません

setlocale() を受け入れるphptester.netで独自のコードを試すことができます。

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

asort($lang,SORT_LOCALE_STRING);
echo "<pre>";
print_r($lang);
echo "</pre>";

echo "<pre>";
/*this should return es_ES; 
if returns false it has failed and asort wont return expected order
*/
var_dump(setlocale(LC_ALL,'es_ES')); 
echo "</pre>";

asort($lang,SORT_LOCALE_STRING);
echo "<pre>";
print_r($lang);
于 2019-12-20T18:24:55.800 に答える