如何在PHP中按多个值对JSON数组排序?

如何在PHP中按多个值对JSON数组排序?,php,arrays,json,Php,Arrays,Json,我在PHP中有一个嵌套的JSON数组,其中包含以下字段: { "items": [{ "id": "8498", "title": "Item 2", "pubdate": "2015-03-01 10:29:00 +0000", }, { "id": "8497", "title": "Item 1", "pubdate": "2015-03-01 16:29:00 +0000",

我在PHP中有一个嵌套的JSON数组,其中包含以下字段:

{
  "items": [{
        "id": "8498",
        "title": "Item 2",
        "pubdate": "2015-03-01 10:29:00 +0000",
     }, {
       "id": "8497",
        "title": "Item 1",
        "pubdate": "2015-03-01 16:29:00 +0000",
    }
  }]
}
我想对Items数组中的节点进行重新排序,以便它们首先按pubdate(从最早到最新)排序,然后在pubdate中,每次按ID(从最小到最大)排序,如果这有意义的话

目前我正在使用下面的函数,但它只接受1个排序值(我目前使用到pubdate)。我可以按上述方式将其修改为接受两个吗

function subval_sort($a,$subkey) {
foreach($a as $k=>$v) {
    $b[$k] = strtolower($v[$subkey]);
}
asort($b);
foreach($b as $key=>$val) {
    $c[] = $a[$key];
}
return $c;
}



$json_o['items'] = subval_sort($json_o['items'],'pubdate');

尝试使用usort

ide1直播:

$arr=json\u decode($json,true);
$items=$arr['items'];
usort($items,function($a,$b){
如果($a['pubdate']=$b['pubdate'])
返回$a['id']<$b['id'];
报税表($a['pubdate']<$b['pubdate'])?-1:1;
});

使用@Gal链接的解决方案解决了它:)


通过修改本文作者的答案,您可以创建一个更通用的解决方案

function subval_sort($a, $key1, $asc1, $key2, $asc2) { 
    # get a list of sort columns and their data to pass to array_multisort
    $sort = array();
    foreach($a as $k=>$v) {
        $sort[$key1][$k] = $v[$key1];
        $sort[$key2][$k] = $v[$key2];
    }
    $sortDesc1 = $asc1 ? SORT_ASC : SORT_DESC;
    $sortDesc2 = $asc2 ? SORT_ASC : SORT_DESC;

    # sort by event_type desc and then title asc
    array_multisort($sort[$key1], $sortDesc1, $sort[$key2], $sortDesc2,$a);
}
您可以这样调用它:

$json_o['items'] = subval_sort($json_o['items'], 'pubdate', false, 'id', true); 
function subval_sort($a, $key1, $asc1, $key2, $asc2) { 
    # get a list of sort columns and their data to pass to array_multisort
    $sort = array();
    foreach($a as $k=>$v) {
        $sort[$key1][$k] = $v[$key1];
        $sort[$key2][$k] = $v[$key2];
    }
    $sortDesc1 = $asc1 ? SORT_ASC : SORT_DESC;
    $sortDesc2 = $asc2 ? SORT_ASC : SORT_DESC;

    # sort by event_type desc and then title asc
    array_multisort($sort[$key1], $sortDesc1, $sort[$key2], $sortDesc2,$a);
}
$json_o['items'] = subval_sort($json_o['items'], 'pubdate', false, 'id', true);