#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
.
Обратите внимание, что этот код предполагает, $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
)
)