PHP按两个条件对数组进行排序

时间:2018-11-08 22:25:14

标签: php

我有一个像这样的数组:

$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'的排列顺序应从最低到最高。我希望你明白我的意思。我可以将其分为三个数组,然后对每个数组进行排序,然后将它们放回一起,但我希望有一个更短,更好的解决方案。

1 个答案:

答案 0 :(得分:2)

只是想解释一下为什么您最初尝试的方法不起作用。

return a['a'] - b['a'] || a['b'] - b['b']

||logical operator,因此当您使用整个表达式将被评估为布尔值时,因此唯一可能的值为truefalse(或在数字上,由于usort比较函数应返回0或1)。由于没有一个比较在||的两端都以零结尾,因此所有这些求和结果均为true,因此没有排序。

使用?:可以工作,因为它不会将整个表达式评估为布尔值,而是会评估第一部分并返回其结果,除非它为零(等于值),否则继续评估第二部分并返回结果。

示例显示了3v4l.org上两个比较之间的差异:https://3v4l.org/32IPa


不过,实际上您可以对该数组进行更简单的排序。

sort($arr);

将起作用。但是,您不能总是指望它能对数组进行排序。它仅在这种情况下起作用,因为所有内部数组都具有相同的键,并且您要按第一个键排序,然后按第二个键排序。 (您可以在“示例#2标准数组比较的转录” here中看到如何比较数组。)