Как отсортировать JSON с несколькими условиями, используя PHP? - PullRequest
1 голос
/ 07 марта 2019

У меня есть некоторые данные JSON, которые я отсортировал по «сайтам», используя usort

    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 Ответ

1 голос
/ 07 марта 2019

Есть ли для меня более простой способ приблизиться к этому, используя 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, что считается ложным, поэтому оператор ?: будет использовать результат второго сравнения.

Этот шаблон может быть связан с произвольным числомсравнений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...