首页 > 解决方案 > 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'应该从最低到最高排序。我希望你知道我的意思。我可以将它分成三个数组,然后对每个数组进行排序,然后将它们重新组合在一起,但我希望有一个更短更好的解决方案。

标签: php

解决方案


只是想解释为什么你最初尝试的东西不起作用。

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

||是一个逻辑运算符,因此当您使用它时,整个表达式将被评估为布尔值,因此唯一可能的值是truefalse(或数字,因为usort比较函数应该返回,0 或 1)。由于没有一个比较在 的两边都以零结束,所以||它们都评估为true,所以没有发生排序。

使用?:instead 有效,因为它不会将整个表达式评估为布尔值,它会评估第一部分并返回结果,除非它为零(相等值),在这种情况下它会继续评估第二部分并返回结果那个。

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


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

sort($arr);

将工作。但是,您不能总是指望它对数组进行排序。它只适用于这种情况,因为所有内部数组都具有相同的键,并且您希望按第一个键排序,然后是第二个键。(您可以在此处的“Example #2 Transcription of standard array comparison”中查看如何比较数组。)


推荐阅读