Как сгруппировать данные 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 Code demo

Это должно помочь:

<?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() был специально разработан для извлечения подстроки.

Другие вопросы по тегам