Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP按两个条件对数组排序_Php - Fatal编程技术网

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。