Сортировка китайских имен в PHP

У меня есть массив, каждый элемент содержит имя и фамилию:

$input = [
  [
    'firstName' => 'foo',
    'lastName' => 'bar',
  ]
];

Для большинства пользователей они в основном на латинском алфавите, но некоторые написаны на китайском языке.

Как бы я отсортировал этот список имен с помощью PHP?

Мне также любопытно о соглашении. Я знаю на языках, использующих латинский алфавит 1, иногда первое имя идет первым, а иногда последнее. Мне любопытно, похожа ли эта ситуация на мандарин, или один обычно предпочитают другому.

И, наконец, мне любопытно, есть ли разница между сортировкой имен и сортировкой слов, как в словаре.

1 ответ

Действительно интересный вопрос! Каждый символ имеет значение Unicode. Большая часть сортировки выполняется через это. Поскольку латинские буквы находятся в диапазоне ASCII, эти имена всегда стоят на первом месте. РНР asort функция будет учитывать Unicode. Вот вход для рассмотрения:

$input = [
    [
        "firstName" => "一",
        "lastName"  => "風"
    ],
    [
        "firstName" => "이",
        "lastName"  => "정윤"
    ],
    [
        "firstName" => "Mari",
        "lastName"  => "M"
    ],
    [
        "firstName" => "三",
        "lastName"  => "火"
    ],
];

Давайте подведем итоги того, что я ожидаю увидеть, предполагая, что мы сортируем по имени:

  • Латинское имя сначала (Мари М)
  • Имена Ханзи / кандзи / хангеул следующие. Я не знаю, каковы значения этих имен, поэтому мы должны выяснить.

Давайте преобразуем первый символ имени в нечто числовое. Опять же, мы используем Unicode для этого преобразования:

  • 一 это 0x4E00
  • 이 это 0xC774
  • М 0x004D
  • 三 это 0x4E09

Таким образом, я ожидаю увидеть по порядку:

  • M

Вот мой код, используя asort:

$nameByFirst = [];
foreach( $input as $i )
{
    $nameByFirst[] = $i["firstName"]." ".$i["lastName"];
}
asort($nameByFirst);

И мой метод печати:

$i = 1;
foreach( $nameByFirst as $name )
{
    echo $i.'.  '.$name."<br>";
    $i++;
}

И мой вывод:

  1. Мари М
  2. 一 風
  3. 三 火
  4. 이 정윤

Мои результаты, как вы можете видеть выше, в порядке. Сначала латынь, затем ханзи / кандзи, затем хангеул. Юникод - самый близкий, я полагаю, что мы можем легко разобраться, так что мне нравится это делать. Я не уверен на 100% в том, как Unicode присваивает значения hanzi/kanji / hangeul, но я готов доверять предоставленному ими порядку, особенно из-за его простоты.

Другие вопросы по тегам