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

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

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

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

Ответ 1

Используйте 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 ファイウォール
)

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

Надеюсь, что это сработает для вас!

Ответ 2

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