sort () для японского - PullRequest
       42

sort () для японского

10 голосов
/ 18 апреля 2011

Если я установил текущую локаль на японский, как я могу сделать так, чтобы японские символы всегда имели более высокий приоритет, чем не японские символы. Например, сейчас английские символы всегда будут появляться перед символами катаканы. Как я могу отменить этот эффект?

Извините, что не очень ясно. Как видите, здесь .

Окончательные результаты получили Java, NVIDIA и Windows フ ァ イ ア ウ ォ ー ル. Занимает первые три места перед японскими персонажами. Возможно ли иметь их в конце?

Ответы [ 2 ]

6 голосов
/ 18 апреля 2011

Используйте usort () вместо sort () , чтобы вы могли определить критерии сравнения по-своему.

Попробуйте этот простой метод.Я попробовал это с примером из здесь , и он работает.

  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 ファイウォール
)

Примечание: это только мое быстрое решение этой проблемы, и это не идеальное решение.Он основан на проверке первого байта при сравнении строк, но вы всегда можете приложить некоторые усилия и улучшить эту функцию, чтобы проверить все многобайтовые символы на соответствие Юникоду, а затем решить, является ли $ a <= $ b или $ a> $ b.

Надеюсь, у вас это получится!

2 голосов
/ 18 апреля 2011

В конечном итоге, PHP sort() оставляет его лежащему в основе libc для реализации сортировки.И, как показано в статье и моем комментарии, не все библиотеки libcs ​​сортируются одинаково.Если вам нужно представить согласованное сопоставление, вам нужно будет использовать что-то вроде Collator, которое использует стороннюю библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...