У меня есть массив, каждый элемент содержит имя и фамилию:
$input = [
[
'firstName' => 'foo',
'lastName' => 'bar',
]
];
Для большинства пользователей они в основном на латинице, но некоторые написаны на китайском языке.
Как бы я отсортировал этот список имен с помощью PHP?
Мне также любопытно о соглашении. Я знаю на языках, использующих латинский алфавит 1, иногда первое имя идет первым, а иногда последнее. Мне любопытно, похожа ли эта ситуация на мандарин, или один обычно предпочитают другому.
И, наконец, мне любопытно, есть ли разница между сортировкой имен и сортировкой слов, как в словаре.
Действительно интересный вопрос! Каждый символ имеет значение Unicode. Большая часть сортировки выполняется через это. Поскольку латинские буквы находятся в диапазоне ASCII, эти имена всегда стоят на первом месте. РНР asort
функция будет учитывать Unicode. Вот вход для рассмотрения:
$input = [
[
"firstName" => "一",
"lastName" => "風"],
[
"firstName" => "이",
"lastName" => "정윤"],
[
"firstName" => "Mari",
"lastName" => "M"],
[
"firstName" => "三",
"lastName" => "火"],
];
Давайте подведем итоги того, что я ожидаю увидеть, предполагая, что мы сортируем по имени:
Давайте преобразуем первый символ имени в нечто числовое. Опять же, мы используем Unicode для этого преобразования:
Таким образом, я ожидаю увидеть по порядку:
Вот мой код, используя asort
:
$nameByFirst = [];
foreach( $input as $i )
{
$nameByFirst[] = $i["firstName"]." ".$i["lastName"];
}
asort($nameByFirst);
И мой метод печати:
$i = 1;
foreach( $nameByFirst as $name )
{
echo $i.'. '.$name."<br>";
$i++;
}
И мой вывод:
Мои результаты, как вы можете видеть выше, в порядке. Сначала латынь, затем ханзи / кандзи, затем хангеул. Unicode — самый близкий, я полагаю, что мы можем легко разобраться, поэтому я хотел бы пойти на это. Я не уверен на 100% в том, как Unicode присваивает значения hanzi / kanji / hangeul, но я готов доверять предоставленному ими порядку, особенно из-за его простоты.
Других решений пока нет …