SORT_REGULAR 类似于<。
似乎SORT_REGULAR 遵循与< 运算符相同的规则(因此,> 运算符)。
在我自己的测试中,对于任何两个值 $v0 和 $v1,以下断言确实通过了:
$pair = [$v0, $v1];
sort($pair);
assert($pair[0] < $pair[1]);
对于混合类型,< 不是严格的弱序。
不幸的是,< 与字符串和整数的混合具有循环行为,并且不具有传递性。因此,它不是Strict weak order
这可以通过以下断言来证明,pass:
assert('3' < '10'); // Numeric comparison. 2 < 12.
assert('10' < '2 '); // Lexicographical comparison
// Circular:
assert('2 ' < '3'); // Lexicographical comparison
// Not transitive:
assert(!('3' < '2 ')); // Lexicographical comparison
// And just because it's interesting:
assert('2 ' < 3); // Numeric comparison. 2 < 3.
排序的思想是,在排序好的item列表中,如果$i < $j,那么!($sorted_items[$j] < $sorted_items[$i])。
这只有在< 是严格的全序或严格的弱序时才有可能。
有时,< 将字符串读取为数字。
以下规则似乎适用于<:
- 如果两个值都是“看起来像”(*) 数字的字符串,则应用数字比较。
- 如果一个值是一个数字,则应用数字比较。
- 如果两个值都是字符串,并且其中至少有一个看起来不像数字,则应用字母(字典)比较。
(*) 字符串 '4' 确实“看起来像”数字 4。字符串 '4 x' 并不“看起来像”数字 4,但 (int)'4 x' 的计算结果仍为 4。
原始示例
这个具体示例中的排序实际上在 PHP 7 中是一致的,只是在 PHP 5.* 中不同,可以看到 here。
这并不意味着 PHP 7 对这个问题免疫。在这个特定的例子中,它恰好没问题。
比较各个值reveals:
hhvm-3.9.1 - 3.12.0, 7.0.0 - 7.1.0alpha2
'0.3' < '.5'
'0.3' < '4'
'0.3' < 'F'
'0.3' < 'z'
'0.3' < 4
'.5' < '4'
'.5' < 'F'
'.5' < 'z'
'.5' < 4
'4' < 'F'
'4' < 'z'
'4' < 4
'F' < 'z'
'F' < 4
'z' < 4
5.5.0 - 5.6.23
'0.3' < '.5'
'0.3' < '4'
'0.3' < 'F'
'0.3' < 'z'
'0.3' < 4
'.5' < '4'
'.5' < 'F'
'.5' < 'z'
'.5' < 4
'4' < 'F'
'4' < 'z'
4 < '4'
'F' < 'z'
'F' < 4
'z' < 4
现在让我们删除无聊的部分。
- “0.3”比其他所有内容都小,因此不属于任何圆圈。
- “.5”比其他所有内容都小(删除“0.3”后),因此不属于任何圆圈。
在 PHP 7 中:
- '4' 比其他所有元素都小,因此不属于任何圆圈。
- 4 比其他任何东西都大,因此不属于任何圈子。
-
'F' < 'z' 仍然存在。没有什么循环的。因此,只有一种可能的排序顺序:['0.3', '.5', '4', 'F', 'z', 4]。
在 PHP 5.* 中:
有多种方法可以用这些结果建立圈子。
这样一个圈子是:'4' < 'F'、'F' < 4、4 < '4'。
这意味着:在任何排序顺序中,至少有两个位置 $i 和 $j 与 $i < $j 但 $sorted[$j] < $sorted[$i]。