интернационализация — сортировка китайских имен в переполнении стека

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

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

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

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

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

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

3

Решение

Действительно интересный вопрос! Каждый символ имеет значение 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. 이 정윤

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

0

Другие решения

Других решений пока нет …