用PHP排序中文名称

时间:2015-04-30 20:02:12

标签: php internationalization chinese-locale

我有一个数组,每个项目都包含名字和姓氏:

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

对于大多数用户来说,他们大部分都是拉丁字母,但有些是用中文写的。

如何使用PHP对这个名称列表进行排序?

我也对会议感到好奇。我知道在使用latin-1字母表的语言中,有时名字首先出现,有时候是最后一个。如果这种情况在普通话中是相似的,或者如果一个人通常优先于另一个,我很好奇。

最后我很好奇,如果在名字排序和单词排序之间存在差异,就像在词典中一样。

1 个答案:

答案 0 :(得分:0)

非常有趣的问题!每个字符都有一个Unicode值。大多数排序都是通过它完成的。由于拉丁字母在ASCII范围内,因此这些名称总是首先出现。 PHP的asort函数将考虑Unicode。以下是需要考虑的输入:

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

让我们总结一下我期望看到的内容,假设我们按名字排序:

  • 拉丁名字第一(Mari M)
  • Hanzi / kanji / hangeul下一个名字。我不知道这些名字的价值是什么,所以我们必须找出答案。

让我们将名字的第一个字符转换为数字字符。同样,我们使用Unicode进行此转换:

  • 一是0x4E00
  • 이是0xC774
  • M是0x004D
  • 三是0x4E09

因此,我希望按顺序看到:

  • 中号

以下是我的代码,使用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. Mari M
  2. 一风
  3. 三火
  4. 이정윤
  5. 正如您在上面所看到的,我的结果是有序的。首先是拉丁语,然后是hanzi / kanji,然后是hangeul。 Unicode是最接近我认为我们可以轻松排序的,所以我喜欢这样做。我不是100%肯定Unicode如何为hanzi / kanji / hangeul分配值,但我愿意相信他们提供的顺序,特别是因为它有多么简单。