Как я могу отсортировать массив JSON по нескольким значениям в PHP? [Дубликат]

0

У меня есть встроенный массив JSON внутри PHP, который содержит следующие поля:

{
  "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 значение сортировки (которое в настоящее время используется для публикации). Могу ли я изменить его, чтобы принять два, как описано выше?

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');
Теги:
arrays

3 ответа

0

Приспосабливая ответ здесь, написанный @Rob, вы можете создать более общее решение.

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); 
0

Попробуйте использовать usort
Live on ide1: http://ideone.com/gJGEON

$arr = json_decode($json, true);
$items = $arr['items'];

usort($items, function($a, $b) {
    if ($a['pubdate'] == $b['pubdate'])
        return $a['id'] < $b['id'];

    return ($a['pubdate'] < $b['pubdate']) ? -1 : 1;
});
-1

Используя решение, связанное с @Gal, решило это :)

$sort = array();
foreach($json_o['items'] as $k=>$v) {
$sort['pubdate'][$k] = $v['pubdate'];
$sort['id'][$k] = $v['id'];
}
array_multisort($sort['pubdate'], SORT_ASC, $sort['id'], SORT_ASC,$json_o['items']);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню