0

I have some JSON data that I would like to regroup by months and ultimately put each group into an HTML unordered list with PHP.

The current 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"
    }
]

I think the following structure is what I would need to be able to echo out into the unordered list by month. Please feel free to suggest otherwise.

{
    "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"
        }
    ]
}
1
  • You have unnecessary comma , in json sample data Commented Mar 17, 2017 at 4:26

3 Answers 3

1

Hope this will work..

$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

Sign up to request clarification or add additional context in comments.

4 Comments

This is exactly what I was looking for, thank you. Down votes must be because it was too easy.
@l3fty downvotes were because you provided absolutely 0 of your own code, and pretty much asked others to do all the work for you.
@Dimi Because I have absolutely no idea how I'd go about doing what I asked. In all honesty, I kept thinking I had to compare dates with the current one and loop through each row. I had thought about posting it but I rather not confused the reader even more with totally incorrect code and just ask a precise question. Isn't that what stackoverflow is for? I didn't see any rules in which I must provide sample code.
@l3fty I personally never downvote anything/anyone(still don't have critic badge), but generally speaking any question that does not have any code gets treated like a homework question and therefore ignored by most people. Try to either link some of the things that you have attempted, or paste some broken code.
1

This should help:

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

Comments

0

There will be several ways to do this:

Input:

$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"}
]';

Method: (Demo) a clean and fast foreach loop

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

It is utterly silly to explode() the date only to insert the generated elements as the new key, when substr() was specifically designed for substring extraction.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.