如何按键对php中的json数组进行排序?

时间:2019-04-03 06:58:43

标签: php

我正在尝试通过php中的键对json数组进行排序。尽管我使用了 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'];
});  

能请你帮我吗?

3 个答案:

答案 0 :(得分: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

Demo on 3v4l.org

请注意,此代码假定$data实际上是JSON字符串。如果它实际上是问题中JSON表示的数组,则可以跳过json_decode步骤。

答案 1 :(得分:0)

您必须解码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)
  }
}

答案 2 :(得分:0)

您可以通过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
        )

)