给出以下数组:
$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()
来解决。
答案 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);