phparraysjsonassociative-arrayremap

Use subarray data from json to create rows of associative arrays


I want to map my JSON response to specific array construction.

Here is my JSON data in short:

"code": 200,
"unit": null,
"data": [
    {
        "2022-11-16": 185.6159202
    },
    {
        "2022-11-17": 204.31997631
    },...
]

I need help to map this data to have array structure just like look array below:

Array ( 
    [0] => Array(
        [date] => 2018-01-03
        [value] => 0.0002444
    )
[1] => Array(
        [date] => 2018-01-04
        [value] => 0.0171476
    )
)

My code in PHP:

$decoded = json_decode($json, true);
$arr = $decoded['data'];

After that, the structure of the array looks like this, which is not quite what I expect:

Array ( 
    [0] => Array ( [2018-01-03] => 0.0002444 ) 
    [1] => Array ( [2018-01-04] => 0.0171476 )
)

Solution

  • Using array_keys() and array_values() is not an ideal/optimal approach because this generates unnecessary depth while accessing the data. See how [0] has to be written after each call? It is not best practice to create a temporary array if you are only going to access the first item from it. Just use key() and current() (or reset()).

    Functional-style programming with array_map(): (Demo)

    var_export(
        array_map(
            fn($item) => ['date' => key($item), 'value' => current($item)],
            json_decode($json, true)['data']
        )
    );
    

    Classic foreach(): (Demo)

    $result = [];
    foreach (json_decode($json, true)['data'] as $item) {
        $result[] = ['date' => key($item), 'value' => current($item)];
    }
    var_export($result);
    

    Or with fewer iterated function calls: (Demo)

    $result = [];
    foreach (json_decode($json, true)['data'] as $item) {
        $key = key($item);
        $result[] = ['date' => $key, 'value' => $item[$key]];
    }
    var_export($result);
    

    Or with compact(): (Demo)

    $result = [];
    foreach (json_decode($json, true)['data'] as $item) {
        foreach ($item as $date => $value) {
            $result[] = compact(['date', 'value']);
        }
    }
    var_export($result);