首页 > 解决方案 > 如何使用 PHP 对具有多个条件的 JSON 进行排序?

问题描述

我有一些使用 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

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

脸书 - ast125

脸书 - ast111

脸书 - ast133

谷歌 - ast133

谷歌 - ast125

但我希望用户在他们的网站组中进行排序

脸书 - ast111

脸书 - ast125

脸书 - ast133

谷歌 - ast125

谷歌 - ast133

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

有没有更简单的方法可以使用 usort 或其他 PHP 函数来解决这个问题?

标签: phpjsonsorting

解决方案


有没有更简单的方法可以使用 usort 或其他 PHP 函数来解决这个问题?

当然。

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

在线演示

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

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


推荐阅读