如何使用PHP对具有多个条件的JSON进行排序?

时间:2019-03-07 20:49:36

标签: php json sorting

我有一些使用usort按“站点”排序的JSON数据

    usort($data,function($a,$b) {
    return strnatcasecmp($a['site'],$b['site']);
  });

结果如下

Array (
    [0] => Array
        (
            [time] => 2017-07-15 15:43:45
            [user] => ast125
            [site] => facebook
        )

    [1] => Array
        (
            [time] => 2017-07-12 04:59:11
            [user] => ast111
            [site] => facebook
        )

    [2] => Array
        (
            [time] => 2017-07-19 12:45:14
            [user] => ast133
            [site] => facebook
        )

    [3] => Array
        (
            [time] => 2017-07-19 12:45:14
            [user] => ast133
            [site] => google
        )

    [4] => Array
        (
            [time] => 2017-07-19 12:45:14
            [user] => ast125
            [site] => facebook

        )

.... and so on

我被困住了,因为现在我不确定如何对每个站点的用户进行排序。 现在,订单是

  

facebook-ast125

     

facebook-ast111

     

facebook-ast133

     

google-ast133

     

google-ast125

但是我希望对用户在其网站用户组中进行排序

  

facebook-ast111

     

facebook-ast125

     

facebook-ast133

     

google-ast125

     

google-ast133

现在,我正在考虑将JSON数组分成多个数组(按站点),然后按用户对新站点数组进行排序,然后将它们合并为一个...

我是否可以使用usort或其他PHP函数来更简单地实现此目的?

1 个答案:

答案 0 :(得分:1)

  

我是否可以使用usort或其他PHP函数来更简单地实现此目的?

当然。

usort($data, function(array $a, array $b) : int {
    return strcasecmp($a['site'], $b['site']) ?: strcasecmp($a['user'], $b['user']);
});

Demo this online

当{{1}中$a$b不同时,第一个'site'将返回非零值,因此将使用该值。当它们相同时,第一个strcasecmp()将返回0,将其视为false,因此strcasecmp()运算符将使用第二个比较的结果。

此模式可以链接到任意数量的比较。