PHP Array to multidimensional json data

Viewed 16

I have the following php code that produces a json data set

$json_data = array(
    "code"=>"200",
    "name"=>"My Name",
    "serial_number"=>"serial"
);

$result =  json_encode($json_data);

The dataset is only one level. As I am creating this data set with a php loop. I want to be able to have multiple people but the code element be outside the users. So basically I want the json data to look like this:

{
    "code": "404",
    "people": [
        {
            "name": "Person 1",
            "serial_number": "xyz"
        },
        {
            "name": "Person Two",
            "serial_number": "123"
        }
    ]
}
1 Answers

Basically you want to group array of objects by property "code". There are many questions about this. Here's one of the possible methods using array_reduce.


$json_data = [
    [
        "code" => "200",
        "name" => "My Name1",
        "serial_number" => "serial1",
    ], [
        "code" => "200",
        "name" => "My Name2",
        "serial_number" => "serial2",
    ], [
        "code" => "400",
        "name" => "My Name3",
        "serial_number" => "serial3",
    ],
];

$result = array_values(array_reduce($json_data, function ($agg, $item) {
    if (!isset($agg[$item['code']])) {
        $agg[$item['code']] = [
            "code" => $item['code'],
            "people" => [],
        ];
    }
    $agg[$item['code']]['people'][] = [
        "name" => $item["name"],
        "serial_number" => $item["serial_number"],
    ];
    return $agg;
}, []));

print_r($result);

Output:

Array
(
    [0] => Array
        (
            [code] => 200
            [people] => Array
                (
                    [0] => Array
                        (
                            [name] => My Name1
                            [serial_number] => serial1
                        )

                    [1] => Array
                        (
                            [name] => My Name2
                            [serial_number] => serial2
                        )

                )

        )

    [1] => Array
        (
            [code] => 400
            [people] => Array
                (
                    [0] => Array
                        (
                            [name] => My Name3
                            [serial_number] => serial3
                        )

                )

        )

)
Related