PHP按两个条件对数组排序
我有这样一个数组:PHP按两个条件对数组排序,php,Php,我有这样一个数组: $arr = [ 0 => [ 'a' => 0, 'b' => 150 ], 1 => [ 'a' => 1, 'b' => 155 ], 2 => [ 'a' => 0, 'b' => 131 ], 3 => [ 'a' => 2,
$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”应该从最低到最高排序。我希望你明白我的意思。我可以将它分成三个数组,然后对每个数组进行排序,然后将它们重新组合在一起,但我希望有一个更短更好的解决方案。只是想解释一下为什么您最初尝试的方法不起作用
return a['a'] - b['a'] || a['b'] - b['b']
| |
是一个,因此当您使用时,整个表达式将作为布尔值计算,因此唯一可能的值是true
或false
(或数值,因为usort
比较函数应返回0或1)。由于没有一个比较结果在| |
的两侧都是零,因此所有比较结果的计算结果都是true
,因此没有进行排序
相反,使用?:
是有效的,因为它不会将整个表达式作为布尔值计算,它会计算第一部分并返回结果,除非它为零(相等值),在这种情况下,它会继续计算第二部分并返回其结果
显示3v4l.org上两个比较之间差异的示例:
不过,实际上可以更简单地对该数组进行排序
sort($arr);
会有用的。不过,在排序数组时,您不能总是指望这样做。它在这种情况下起作用,因为所有内部数组都有相同的键,您需要按第一个键排序,然后按第二个键排序。(您可以在“标准数组比较的示例2转录”中看到数组是如何比较的)只是想解释一下为什么您最初尝试的方法不起作用
return a['a'] - b['a'] || a['b'] - b['b']
| |
是一个,因此当您使用时,整个表达式将作为布尔值计算,因此唯一可能的值是true
或false
(或数值,因为usort
比较函数应返回0或1)。由于没有一个比较结果在| |
的两侧都是零,因此所有比较结果的计算结果都是true
,因此没有进行排序
相反,使用?:
是有效的,因为它不会将整个表达式作为布尔值计算,它会计算第一部分并返回结果,除非它为零(相等值),在这种情况下,它会继续计算第二部分并返回其结果
显示3v4l.org上两个比较之间差异的示例:
不过,实际上可以更简单地对该数组进行排序
sort($arr);
会有用的。不过,在排序数组时,您不能总是指望这样做。它在这种情况下起作用,因为所有内部数组都有相同的键,您需要按第一个键排序,然后按第二个键排序。(您可以在“示例#2标准数组比较的转录”中看到数组是如何比较的)您已经尝试了什么?你在哪里卡住了?应该有帮助。@fubar我尝试使用类似于
的方法返回a['a']-b['a']|a['b']-b['b']
但没有work@Don“哇worked@nick是的。你可以在这里看到我的答案,我不知道我的原始评论去了哪里(使用?:
而不是|
)你已经尝试了什么?你在哪里卡住了?应该有帮助。@fubar我尝试使用类似于的方法返回a['a']-b['a']|a['b']-b['b']
但没有work@Don“哇worked@nick是的。您可以在这里看到我的答案,了解一些解释,不知道我的原始注释去了哪里(使用?:
而不是|
),如果我要排序的键之间有更多的键怎么办?或者最后一个在第一个之前?仍然可以使用sort()执行此操作吗?否,sort首先比较两个数组的长度,然后如果它们相等,则按顺序比较每个键/值。因此,如果列的排序顺序与排序优先级不同,则需要使用不同的方法,如usort。如果要排序的列之间有更多键,该怎么办?或者最后一个在第一个之前?仍然可以使用sort()执行此操作吗?否,sort首先比较两个数组的长度,然后如果它们相等,则按顺序比较每个键/值。因此,如果列的顺序与排序优先级不同,则需要使用不同的方法,如usort。