У меня есть встроенный массив 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');
Приспосабливая ответ здесь, написанный @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);
Попробуйте использовать 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;
});
Используя решение, связанное с @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']);