My question is how to get or split an array by year using in array key date by ascending order,
I've tried many... but I didn't get it,
[
{
"id": "47",
"date": "07/16/2022",
"text": "ph"
}
{
"id": "46",
"date": "06/16/2022",
"text": "ph"
},
{
"id": "45",
"date": "06/16/2021",
"text": "ph"
}]
And the output I need is,
[
"2021": [{
"id": "45",
"date": "06/16/2021",
"text": "ph"
}],
"2022": [{
"id": "46",
"date": "06/16/2022",
"text": "ph"
},
{
"id": "47",
"date": "07/16/2022",
"text": "ip"
}]
]
How to do it in either PHP or JavaScript?
CodePudding user response:
This is a demo on how to transform your input array in the expected output object using javascript:
const input = [
{
"id": "47",
"date": "07/16/2022",
"text": "ph"
},
{
"id": "46",
"date": "06/16/2022",
"text": "ph"
},
{
"id": "45",
"date": "06/16/2021",
"text": "ph"
}
];
const output = {};
//for each object in the input array
for(o of input){
//parse the year part of the date property
const year = o.date.substring(6);
//if the parsed year doesn't exist yet in the output object
if (!output.hasOwnProperty(year))
//then add an empty array to the year key in the output object
output[year] = [];
//add the current input object to the array bound to the year key in the output object
output[year].push(o);
}
console.log( output );
And this is the same logic implemented using php:
<?php
$input = [
[
"id" => "47",
"date" => "07/16/2022",
"text" => "ph"
],
[
"id" => "46",
"date" => "06/16/2022",
"text" => "ph"
],
[
"id" => "45",
"date" => "06/16/2021",
"text" => "ph"
]
];
$output = [];
//for each object in the input array
foreach($input as $o){
//parse the year part of the date property
$year = substr($o['date'], 6);
//if the parsed year doesn't exist yet in the output object
if (!array_key_exists($year, $output))
//then add an empty array to the year key in the output object
$output[$year] = [];
//add the current input object to the array bound to the year key in the output object
$output[$year][] = $o;
}
var_dump( $output );
CodePudding user response:
The PHP version could look like this:
$input = [
[
"id" => "47",
"date" => "07/16/2022",
"text" => "ph"
],
[
"id" => "46",
"date" => "06/16/2022",
"text" => "ph"
],
[
"id" => "45",
"date" => "06/16/2021",
"text" => "ph"
]
];
$result = [];
foreach ($input as $entry) {
$date = new DateTime($entry['date']);
$result[$date->format('Y')][] = $entry;
}
ksort($result);
As asked on Diego's answer I've thrown ksort
into the mix as well, which sorts the resulting array by the keys in descending order.