Как отсортировать массив json в php по ключу?

#php

#php

Вопрос:

Я пытаюсь отсортировать массив json по ключу в php. Хотя я использую usort, это не работает. Мой массив json

 $data = [
    {
        "profile_name": "J3S",
        "post_count": 9
    },
    {
        "profile_name": "John",
        "post_count": 3
    },
    {
        "profile_name": "sato",
        "post_count": 10
    }
]
  

Я хотел бы отсортировать массив по post_count.
Вот мой код, который я пробовал.

 $data = json_encode($data, true);

usort($data, function ($a, $b) {
    return $a['post_count'] <=> $b['post_count'];
});  
  

Не могли бы вы мне помочь?

Комментарии:

1. Является $data строкой JSON? Потому что это недопустимая структура PHP.

2. Нет такой вещи, как массив JSON, поскольку JSON является строковым представлением данных массива (и объектов). Итак, ваша сортировка по строке. Другими словами, сначала отсортируйте массив, а затем преобразуйте его в JSON.

Ответ №1:

Вы можете использовать array_multisort , чтобы сделать это эффективно:

 $array = json_decode($data, true);
array_multisort(array_column($array, 'post_count'), SORT_ASC, $array);
echo json_encode($array, JSON_PRETTY_PRINT);
  

Вывод:

 [
  { "profile_name": "John", "post_count": 3 } 
  { "profile_name": "J3S", "post_count": 9 },
  { "profile_name": "sato", "post_count": 10 },
]
  

Если вы хотите отсортировать по post_count убыванию, просто измените SORT_ASC на SORT_DESC в вызове на array_multisort .

Демонстрация на 3v4l.org

Обратите внимание, что этот код предполагает, $data что на самом деле это строка JSON. Если это на самом деле массив, представленный JSON в вопросе, вы можете пропустить json_decode шаг.

Ответ №2:

Вы должны декодировать json, а не кодировать его:

 $data = '[
    {
        "profile_name": "J3S",
        "post_count": 9
    },
    {
        "profile_name": "John",
        "post_count": 3
    },
    {
        "profile_name": "sato",
        "post_count": 10
    }
]';

$data = json_decode($data, true);

usort($data, function ($a, $b) {
    return $a['post_count'] <=> $b['post_count'];
}); 
  

Я полагаю, что ваш json — это строка, потому что, если это не так, это недопустимый php.

Вывод ( var_dump( $data ); ):

 array(3) {
  [0]=>
  array(2) {
    ["profile_name"]=>
    string(4) "John"
    ["post_count"]=>
    int(3)
  }
  [1]=>
  array(2) {
    ["profile_name"]=>
    string(3) "J3S"
    ["post_count"]=>
    int(9)
  }
  [2]=>
  array(2) {
    ["profile_name"]=>
    string(4) "sato"
    ["post_count"]=>
    int(10)
  }
}
  

Ответ №3:

Вы можете сделать это с помощью usort() функции.

Добавьте функцию обратного вызова и каждый раз сравнивайте profile_count .

 <?php
$data = [
    ["profile_name"=> "J3S", "post_count"=> 9],
    ["profile_name"=> "John", "post_count"=> 3],
    ["profile_name"=> "sato", "post_count"=> 10]
];
function cmpBySort($a, $b) {
    return $a['post_count'] - $b['post_count'];
}
usort($data, 'cmpBySort');
echo '<pre>';print_r($data);echo '</pre>';
  

Вывод:

 Array
(
    [0] => Array
        (
            [profile_name] => John
            [post_count] => 3
        )

    [1] => Array
        (
            [profile_name] => J3S
            [post_count] => 9
        )

    [2] => Array
        (
            [profile_name] => sato
            [post_count] => 10
        )

)