我有一个像这样的数组:
$arr = [
0 => [
'a' => 0,
'b' => 150
],
1 => [
'a' => 1,
'b' => 155
],
2 => [
'a' => 0,
'b' => 131
],
3 => [
'a' => 2,
'b' => 241
],
4 => [
'a' => 2,
'b' => 45
],
5 => [
'a' => 1,
'b' => 23
],
6 => [
'a' => 0,
'b' => 78
],
7 => [
'a' => 0,
'b' => 123
],
8 => [
'a' => 1,
'b' => 412
],
9 => [
'a' => 0,
'b' => 22
],
10 => [
'a' => 0,
'b' => 11
],
11 => [
'a' => 2,
'b' => 100
],
12 => [
'a' => 2,
'b' => 105
],
13 => [
'a' => 1,
'b' => 18
]
];
我想首先按'a'属性对数组进行排序,因此所有0,所有1和所有2应该在一起,然后所有'b'的排列顺序应从最低到最高。我希望你明白我的意思。我可以将其分为三个数组,然后对每个数组进行排序,然后将它们放回一起,但我希望有一个更短,更好的解决方案。
答案 0 :(得分:2)
只是想解释一下为什么您最初尝试的方法不起作用。
return a['a'] - b['a'] || a['b'] - b['b']
||
是logical operator,因此当您使用整个表达式将被评估为布尔值时,因此唯一可能的值为true
或false
(或在数字上,由于usort
比较函数应返回0或1)。由于没有一个比较在||
的两端都以零结尾,因此所有这些求和结果均为true
,因此没有排序。
使用?:
可以工作,因为它不会将整个表达式评估为布尔值,而是会评估第一部分并返回其结果,除非它为零(等于值),否则继续评估第二部分并返回结果。
示例显示了3v4l.org上两个比较之间的差异:https://3v4l.org/32IPa
不过,实际上您可以对该数组进行更简单的排序。
sort($arr);
将起作用。但是,您不能总是指望它能对数组进行排序。它仅在这种情况下起作用,因为所有内部数组都具有相同的键,并且您要按第一个键排序,然后按第二个键排序。 (您可以在“示例#2标准数组比较的转录” here中看到如何比较数组。)