Как сгруппировать данные JSON по гггг-мм, используя значения элемента даты?
У меня есть некоторые данные JSON, которые я хотел бы перегруппировать по месяцам и в конечном итоге поместить каждую группу в неупорядоченный список HTML с помощью PHP.
Текущий JSON:
[
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-15"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-08"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-25"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-14"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-12-25"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-01-06"
}
]
Я думаю, что следующая структура - это то, что мне нужно, чтобы иметь возможность отражаться в неупорядоченном списке по месяцам. Пожалуйста, не стесняйтесь предложить иначе.
{
"2017-03": [
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-15"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-08"
}
],
"2017-02": [
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-25"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-14"
}
],
"2016-12": [
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-12-25"
}
],
"2016-01": [
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-01-06"
}
]
}
3 ответа
Решение
Надеюсь, что это будет работать..
$string='[
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-15"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-08"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-25"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-14"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-12-25"
},
{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-01-06"
}
]';
$array=array();
$result=array();
$array= json_decode($string,true);
foreach($array as $value)
{
$key=explode("-", $value["date"]);
unset($key[2]);
$key=implode("-", $key);
$result[$key][]=$value;
}
echo json_encode($result,JSON_PRETTY_PRINT);
Это должно помочь:
<?php
$json = '[{
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-15"
}, {
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-08"
}, {
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-25"
}, {
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-14"
}, {
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-12-25"
}, {
"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-01-06"
}]';
$json_decode_array = json_decode($json, true);
$result_set = [];
foreach ($json_decode_array as $key => $value) {
$new_key = explode("-", $value["date"]);
$result_set_key = $new_key[0] . '-' . $new_key[1];
$result_set[$result_set_key][] = $value;
}
print_r(json_encode($result_set,JSON_PRETTY_PRINT));
Будет несколько способов сделать это:
Входные данные:
$json='[
{"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-15"},
{"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-03-08"},
{"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-25"},
{"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2017-02-14"},
{"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-12-25"},
{"title": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2016-01-06"}
]';
Метод: ( Демо) чистый и быстрый цикл foreach
$array=json_decode($json,true);
foreach($array as $a){
$result[substr($a['date'],0,7)][]=$a; // truncate the dates before assigning as keys
}
echo json_encode($result,JSON_PRETTY_PRINT);
Совершенно глупо explode()
дата только для вставки сгенерированных элементов в качестве нового ключа, когда substr()
был специально разработан для извлечения подстроки.