为什么排序规则在PHP中产生不一致的结果?
我正在开发一个在PHP中使数组排序更容易的类,我一直在使用SORT_u常量,但是行为或为什么排序规则在PHP中产生不一致的结果?,php,arrays,sorting,Php,Arrays,Sorting,我正在开发一个在PHP中使数组排序更容易的类,我一直在使用SORT_u常量,但是行为或SORT_uregular(默认排序类型)似乎有所不同,这取决于在数组中添加项的顺序。此外,我无法找出一个模式来解释为什么会出现这种情况 数组项: $a = '0.3'; $b = '.5'; $c = '4'; $d = 'F'; $e = 'z'; $f = 4; sort(array($d, $e, $a, $f, $b, $c)); // Produces... array(6) { [0]=&
SORT_uregular
(默认排序类型)似乎有所不同,这取决于在数组中添加项的顺序。此外,我无法找出一个模式来解释为什么会出现这种情况
数组项:
$a = '0.3';
$b = '.5';
$c = '4';
$d = 'F';
$e = 'z';
$f = 4;
sort(array($d, $e, $a, $f, $b, $c));
// Produces...
array(6) {
[0]=>
string(3) "0.3"
[1]=>
string(2) ".5"
[2]=>
string(1) "4"
[3]=>
string(1) "F"
[4]=>
string(1) "z"
[5]=>
int(4)
}
sort(array($d, $e, $b, $f, $c, $a));
// Produces...
array(6) {
[0]=>
string(3) "0.3"
[1]=>
string(2) ".5"
[2]=>
string(1) "F"
[3]=>
string(1) "z"
[4]=>
int(4)
[5]=>
string(1) "4"
}
场景1:
$a = '0.3';
$b = '.5';
$c = '4';
$d = 'F';
$e = 'z';
$f = 4;
sort(array($d, $e, $a, $f, $b, $c));
// Produces...
array(6) {
[0]=>
string(3) "0.3"
[1]=>
string(2) ".5"
[2]=>
string(1) "4"
[3]=>
string(1) "F"
[4]=>
string(1) "z"
[5]=>
int(4)
}
sort(array($d, $e, $b, $f, $c, $a));
// Produces...
array(6) {
[0]=>
string(3) "0.3"
[1]=>
string(2) ".5"
[2]=>
string(1) "F"
[3]=>
string(1) "z"
[4]=>
int(4)
[5]=>
string(1) "4"
}
场景2:
$a = '0.3';
$b = '.5';
$c = '4';
$d = 'F';
$e = 'z';
$f = 4;
sort(array($d, $e, $a, $f, $b, $c));
// Produces...
array(6) {
[0]=>
string(3) "0.3"
[1]=>
string(2) ".5"
[2]=>
string(1) "4"
[3]=>
string(1) "F"
[4]=>
string(1) "z"
[5]=>
int(4)
}
sort(array($d, $e, $b, $f, $c, $a));
// Produces...
array(6) {
[0]=>
string(3) "0.3"
[1]=>
string(2) ".5"
[2]=>
string(1) "F"
[3]=>
string(1) "z"
[4]=>
int(4)
[5]=>
string(1) "4"
}
有什么想法吗?这种行为是“预期的”(或至少是已知的),因为您对值(字符串和整数)使用不同的类型。请参阅该功能的手册
警告
使用混合类型值对数组进行排序时要小心,因为sort()可能会产生不可预知的结果
很可能在排序算法中的某个时刻,它将两个值作为整数而不是字符串进行比较。为了避免这种情况,不要尝试使用不同类型的数组进行排序(如手册所述)。
警告
使用混合类型值对数组进行排序时要小心,因为sort()
可能产生不可预测的结果
您应该使用一个SORT_*常量
这里有一些评论:
@hakre:它是关于用于给定排序策略的比较函数/运算符的传递性,而不是稳定性谢谢。。。有趣的解释。我对内部结构不太了解,但我猜所有内容都会与其他内容进行比较,因此无论输入顺序如何,您都会期望得到一致的结果;显然不是这样。谢谢,我实际上正在编写一个单元测试,以确保排序类复制本机PHP算法,这就是我偶然发现这个问题的原因。每次我更改输入时,预期输出的顺序都会更改!我将把它归结为“其中之一”。