PHP中基于语言环境的数组排序在OS X上的结果与Ubuntu的结果不同

时间:2019-05-08 08:17:51

标签: php macos sorting locale

给出以下数组:

$foo = ["a", "B", "æ", "Æ", "c", "A", "b", "C", "1"];

然后,我用setlocale(LC_ALL, ['nb_NO.UTF-8', 'no_NO.UTF-8']);设置语言环境,并通过sort($foo, SORT_LOCALE_STRING)运行数组。

在Ubuntu中,排序后的数组将如下所示:

[
  0 => '1',
  1 => 'A',
  2 => 'a',
  3 => 'B',
  4 => 'b',
  5 => 'C',
  6 => 'c',
  7 => 'Æ',
  8 => 'æ',
]

在Mac(OS X)上,我得到:

[
  0 => '1',
  1 => 'A',
  2 => 'B',
  3 => 'C',
  4 => 'a',
  5 => 'b',
  6 => 'c',
  7 => 'Æ',
  8 => 'æ',
]

似乎OS X希望自己对以大写字母开头的字符串(ABC,然后是abc)进行排序,而我希望它们在一起(AaBbCc)。 / p>

有什么方法可以使它们在PHP中以相同的方式对数组进行排序,还是我必须编写一种自定义的排序方法,而不是使用u*sort()方法之一?

编辑:似乎与the question this is marked as a duplicate of非常相似。尽管OS X似乎仍然可以将大写和小写字母依次排序而不是混合使用,但可以通过在排序函数中添加strtolower()来解决。

1 个答案:

答案 0 :(得分:1)

解决此问题的最干净,最专业的方法是确保您实际上在两种环境中都设置相同的语言环境。请read though the manual and the comments presented below the specs了解有关如何正确设置和获取语言环境的见解。设置语言环境可能很麻烦,您可能需要更改某些语言的语法,并声明其他语言的后备值。辛苦是您的责任。

对于热/临时修复,您可以调用usort(),将飞船运算符放在一系列条件之间。首先,在多字节安全地将$a$b都转换为大写之后,将它们进行比较,如果该比较是平局,则太空飞船运营商将对原始$a与{{ 1}}。

代码:(Demo

$b

输出:

$foo = ["a", "B", "æ", "Æ", "c", "A", "b", "C", "1"];

usort($foo, function($a, $b) {
    return [mb_strtoupper($a), $a] <=> [mb_strtoupper($b), $b];
});

var_export($foo);