phpjqueryarraysjsongrouping

Restructure/Pivot json data


I have a JSON array and I need to change that into another array format. Please look into the following data:

{
    "BUS NO.1": [
        {"trip":"Trip00011","runningKm": "5000"},
        {"trip":"Trip00012","runningKm":"2565"}
    ],
    "BUS NO.2":[
        {"trip":"Trip00021","runningKm": "2400"},
        {"trip":"Trip00023","runningKm":"1500"},
        {"trip":"Trip00025","runningKm":"3000"}
    ]
}

Desired result:

{
    "data": [
        {
            "y": "BUS NO.1",
            "Trip00011": "5000",
            "Trip00012": "2565"
        },
        {
            "y": "BUS NO.2",
            "Trip00021": "2400",
            "Trip00023": "1500",
            "Trip00025": "3000"
        }
    ]
}

Solution

  • Try this one. You'll only need 1 loop and an array_merge.

    $originalData = [
        [
            'vehicle' => 'BUS NO.1',
            'trip_name' => 'Trip00011', 
            'running_km' => '5000'
        ],
        [
            'vehicle' => 'BUS NO.2',
            'trip_name' => 'Trip00021', 
            'running_km' => '2400'
        ],
        [
            'vehicle' => 'BUS NO.2',
            'trip_name' => 'Trip00023', 
            'running_km' => '1500'
        ],
    ];
    
    $responseData = [];
    
    foreach ($originalData as $od){
        $temp = [
            'y' => $od['vehicle'],
        ];
    
        $temp[$od['trip_name']] = $od['running_km'];
    
        if (!isset($responseData[$od['vehicle']])){
            $responseData[$od['vehicle']] = $temp;  
        } else {
            $responseData[$od['vehicle']] = array_merge($responseData[$od['vehicle']], $temp);
        }
    }
    
    echo json_encode(array_values($responseData));
    

    Output (JSON): [{"y":"BUS NO.1","Trip00011":"5000"},{"y":"BUS NO.2","Trip00021":"2400","Trip00023":"1500"}]