在PHP中迭代和分组对象数组

时间:2018-03-16 18:23:21

标签: php mysql json

我有以下MySQL表:

+----+----------+--------+------+
| id | brand    | model  | year |
+----+----------+--------+------+
| 1  | audi     | tt     | 2014 |
+----+----------+--------+------+
| 2  | audi     | a4     | 2015 |
+----+----------+--------+------+
| 3  | mercedes | aclass | 2014 |
+----+----------+--------+------+
| 4  | mercedes | cclass | 2017 |
+----+----------+--------+------+

我在PHP中使用MYSQL并编写查询来获取此数据:

$carsQuery = SELECT * FROM cars_table ORDER BY model ASC;

执行查询后,我使用PHP尝试实现以下JSON对象输出:

{
    "car_models": [
        {
            "id": "audi",
            "name": "Audi",
            "cars": [
                {
                    "id": "1",
                    "model": "tt",
                    "year": "2014",
                    "brand": "audi"
                    },
                {
                    "id": "2",
                    "model": "a4",
                    "year": "2015",
                    "brand": "audi"
                }
            ]
        },
        {
            "id": "mercedes",
            "name": "Mercedes",
            "cars": [
                {
                    "id": "3",
                    "model": "aclass",
                    "year": "2014",
                    "brand": "mercedes"
                    },
                    {
                    "id": "4",
                    "model": "cclass",
                    "year": "2017",
                    "brand": "mercedes"
                    }
            ]
        }
    ]
}

以下代码片段是我用来实现此目的的PHP代码:

foreach($carsQuery as $carQuery){ 
        $cars[$carQuery->brand][] = $carQuery;
    }

return array( 
        'car_models' => $carQuery
        ); 

结果被分组但是我无法达到添加其他字段以实现我想要的JSON对象的程度。

1 个答案:

答案 0 :(得分:2)

添加其他字段主要是在您正在构建的数组中定义它们。

foreach ($carsQuery as $carQuery) {
    $cars[$carQuery->brand]['id'] = $carQuery->brand;
    $cars[$carQuery->brand]['name'] = ucfirst($carQuery->brand);
    $cars[$carQuery->brand]['cars'][] = $carQuery;
}
对于同一品牌的多个记录,

'id'和'name'将被覆盖相同的值。

您可能需要使用除ucfirst之外的其他方法来格式化'name'字段,因为某些值可能具有不同的大小写。

您还应该使用array_values创建最终数组,以便用数字键替换字符串键。

return array(
    'car_models' => array_values($cars)
);

这将确保car_models是最终JSON中的对象数组,而不是对象。