sort函数整理
1 主题:数字型排序(sort_numeric)
案例1.1
$arr = [3, 100, 1, 20, 4, 0];
sort($arr, SORT_NUMERIC);
out($arr);
输出:0, 1, 3, 4, 20, 100
案例1.2
$arr = [2, 2.4, 1.2, 100, 10, 1.5, 1];
sort($arr, SORT_NUMERIC);
out($arr);
输出:1, 1.2, 1.5, 2, 2.4, 10, 100
2 主题 字符串型排序(sort_string)
案例2.1
$arr = [1, 10, 2];
sort($arr, SORT_STRING);
out($arr);
输出:1,10,2
3 主题:自然排序(SORT_NATURAL)
对比3.1
$arr = ['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in'];
sort($arr, SORT_STRING);
out($arr);
输出结果:
1 ft 5 in,10 ft 2 in,2 ft 11 in,2 ft 7 in,7 ft 6 in,
对比3.2
$arr = ['2 ft 7 in', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 ft 6 in'];
sort($arr, SORT_NATURAL);
out($arr);
输出结果:
1 ft 5 in,2 ft 7 in,2 ft 11 in,7 ft 6 in,10 ft 2 in
备注:
// 关于自然序 这个链接很好 https://pypi.org/project/natsort/
4,主题:大小写不敏感(SORT_FLAG_CASE)
// can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitively
案例4.1
$arr = ['orange', 'Orange', 'apple', 'Apple'];
sort($arr, SORT_STRING);
out($arr);
输出:
Apple,Orange,apple,orange,
案例4.2
$arr = ['orange', 'Orange', 'apple', 'Apple'];
sort($arr, SORT_FLAG_CASE | SORT_STRING);
out($arr);
输出:
apple,Apple,orange,Orange,
解释:
第一个案例;单纯的string排序,是按照ascii排序的
因为大写字母比小写字母的ascii排序靠前,排序也更靠前
所以,输出的结果是:Apple,Orange,apple,orange
第二个案例:按照string不敏感方式排序,先将大写字母转换成小写字母,再按ascii码排序
第一步转换:大写字母->小写, Apple->apple
第二步排序:apple, apple, orange, orange
第三步映射回原始数据: apple, Apple, orange, Orange
这里还有个问题,apple和Apple的排序是否稳定?
案例4.3
$arr = ['Orange', 'orange', 'apple', 'Apple'];
sort($arr, SORT_FLAG_CASE | SORT_STRING);
out($arr);
这里看到和案例4.2对比,结果是不稳定的, orange, Orange的顺序是不定的,
它只能保证, 都是小写字母的情况下,不同的字符串的排序, 但是对于不同的大小写字符串转换为相同的小写字符串时,排序不保证的
这就提醒我们,在用SORT_FLAG_CASE | SORT_STRING排序时,一定不要对此种情况有预期
案例4.4
$arr = ['2 ft 7 In', '1 ft 5 in', '10 ft 2 in', '2 Ft 11 in', '7 Ft 6 in'];
sort($arr, SORT_NATURAL);
out($arr);
结果:1 ft 5 in,2 Ft 11 in,2 ft 7 In,7 Ft 6 in,10 ft 2 in
案例4.5
$arr = ['2 Ft 7 In', '1 ft 5 in', '10 ft 2 in', '2 ft 11 in', '7 Ft 6 in'];
sort($arr, SORT_NATURAL | SORT_FLAG_CASE);
out($arr);
结果:
1 ft 5 in,2 Ft 7 In,2 ft 11 in,7 Ft 6 in,10 ft 2 in,
可以看到
4.4 案例中的2 Ft 11 in, 2 ft 7 In,这个不符合自然排序
而4.5 用sort_flag_case来消除了大小写敏感的限制, 修正成为大小写不敏感的自然排序,排序结果更符合人类理解
总结:
现在再来看这个注释,就容易理解了
can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitively
必须要和其他排序方式一起使用,意味着,只有两种用法:
SORT_FLAG_CASE | SORT_STRING
SORT_FLAG_CASE | SORT_NATURAL
整体的介绍页面:https://www.php.net/manual/en/function.sort.php
特别的,
If two members compare as equal, their relative order in the sorted array is undefined.
如果两个成员的比较是相同的,他们的相对位置是不确定的