PHP不区分大小写的排序使用不同顺序的相同数据产生不同的结果



这是从我正在处理的一个更大的项目中提取的,数据集不一样,但我已经将问题缩小到尽可能小的范围,只需声明一个数组,对其进行排序并转储,但问题仍然存在,并且可以重现。

此代码:

<?php
$array = array("Z", "z", "Y", "y", "B", "b", "A", "a");
sort($array, SORT_STRING | SORT_FLAG_CASE);
var_dump($array);

结果:

array(8) {
[0]=>
string(1) "A"
[1]=>
string(1) "a"
[2]=>
string(1) "B"
[3]=>
string(1) "b"
[4]=>
string(1) "Y"
[5]=>
string(1) "y"
[6]=>
string(1) "Z"
[7]=>
string(1) "z"
}

但是这个代码:

<?php
$array = array("Z", "z", "Y", "y", "b", "B", "a", "A");
sort($array, SORT_STRING | SORT_FLAG_CASE);
foreach( $array as $ar )
{
echo $ar . PHP_EOL;
}

结果:

array(8) {
[0]=>
string(1) "a"
[1]=>
string(1) "A"
[2]=>
string(1) "b"
[3]=>
string(1) "B"
[4]=>
string(1) "Y"
[5]=>
string(1) "y"
[6]=>
string(1) "Z"
[7]=>
string(1) "z"
}

为什么?这是相同的数据,以不同的顺序,以相同的方式排序——它肯定会产生相同的一致输出吗?

我花了好几天的时间试图弄清楚这一点,这非常令人沮丧。也许这是一件简单的事情,也许不是。

Nigel的评论已经解释了不一致结果背后的原因,这里有一个获得所需一致性的解决方法。

<?php
$array = array("Z", "z", "Y", "y", "B", "b", "A", "a");
sort($array, SORT_STRING);
sort($array, SORT_STRING | SORT_FLAG_CASE);
var_dump($array);
$array = array("Z", "z", "Y", "y", "b", "B", "a", "A");
sort($array, SORT_STRING);
sort($array, SORT_STRING | SORT_FLAG_CASE);
var_dump($array);

最新更新