在数组内部创建数组,从mysql数据到json

时间:2016-01-08 02:22:27

标签: php mysql arrays json multidimensional-array

我正在尝试用两个mysql表创建带有php的json:
- 类别(唯一)
- 子类别或权利(同一类别中的多个)

但我可以不要在一个类别下列出多个子类别。相反,对于每个子类别,也会生成包含类别数据的新结果集 这是php代码:

$sql = "SELECT a.id as rid,a.name as rname,a.img as rimg,a.price,b.id as cid,b.name as cname FROM rights a INNER JOIN categories b ON a.category=b.id";

$result = $mysqli->query($sql);
    if ($result->num_rows > 0) {
        $json_response = array();
        while($row = $result->fetch_assoc()) {
            $row_array['idCategory'] = $row['cid'];
            $row_array['nameCategory'] = $row['cname'];
            $row_array['rights'] = array([
                'idRight' => $row['rid'],
                'name' => $row['rname'],
                'price' => $row['price'],
                'image' => $row['rimg']
            ]);

            array_push($json_response,$row_array);
        }

        echo json_encode($json_response);
    }

我得到了这个:

[{
    "idCategory": "1",
    "nameCategory": "Cat1",
    "rights": [{
        "idRight": "1",
        "name": "Right1 in Cat1",
        "price": "10",
        "image": "img1.jpg"
    }]
}, {
    "idCategory": "2",
    "nameCategory": "Cat2",
    "rights": [{
        "idRight": "2",
        "name": "Right1 in Cat2",
        "price": "20",
        "image": "img2.jpg"
    }]
}, {
    "idCategory": "2",
    "nameCategory": "Cat2",
    "rights": [{
        "idRight": "3",
        "name": "Right2 in Cat2",
        "price": "30",
        "image": "img3.jpg"
    }]
}]

我尝试用GROUP_CONCAT和GROUP BY更改mysql select,但后来我在这一行中得到数据:

"rights": [{
            "idRight": "2,3",
            "name": "Right1 in Cat2,Right2 in Cat2",
            "price": "20,30",
            "image": "img2.jpg,img3.jpg"
        }]

但我需要这样:

[{
    "idCategory": "1",
    "nameCategory": "Cat1",
    "rights": [{
        "idRight": "1",
        "name": "Right1 in Cat1",
        "price": "10",
        "image": "img1.jpg"
    }]
}, {
    "idCategory": "2",
    "nameCategory": "Cat2",
    "rights": [{
        "idRight": "2",
        "name": "Right1 in Cat2",
        "price": "20",
        "image": "img2.jpg"
    },
    {
        "idRight": "3",
        "name": "Right2 in Cat2",
        "price": "30",
        "image": "img3.jpg"
    }]
}]

如何实现?

2 个答案:

答案 0 :(得分:3)

你需要重新映射你的数组,然后为权限键初始化一个数组...所以,改变你的while循环:

$json_response = array();
while($row = $result->fetch_assoc()) {
    if (!isset($json_response[ $row['idCategory'] ])) {
        $json_response[ $row['idCategory'] ] = [
            'idCategory' => $row['idCategory'],
            'nameCategory' => $row['nameCategory'],
            'rights' => [],
        ];
    }
    $json_response[ $row['idCategory'] ]['rights'][] = [
        'idRight' => $row['rid'],
        'name' => $row['rname'],
        'price' => $row['price'],
        'image' => $row['rimg']
    ];
}

// We want the final result to ignore the keys and to create a JSON array not a JSON object 
$data = [];
foreach ($json_response as $element) {
    $data[] = $element;
}

echo json_encode($data);

代码$json_response[ $row_array['idCategory'] ]的这一部分有助于维护数据的唯一分组,因为它基于idCategory创建了一个哈希。一个数组只能有一个键,因为idCategory总是唯一的,我们可以使用它作为分组的键。 然后因为我们现在有了一个基于散列的数组,我们必须创建一个新的数组,当它转换为JSON时,它是一个“真正的”数组。 在这种情况下,您不想使用GROUP BY或GROUP_CONCAT。

答案 1 :(得分:0)

我修改了上面的代码以适合我的需要,但是我无法制作该数组的另一个数组...

来自: ...

$json_response[ $row['idCategory'] ]['rights'][] = [
    'idRight' => $row['rid'],
    'name' => $row['rname'],
    'price' => $row['price'],
    'image' => $row['rimg']
];

收件人:

    $json_response[ $row['regCode'] ]['provinces'][] = $row['provDesc'];

实际上这是一个后续问题, 那个数组里面的数组怎么样...

像这样:

[
 {
  rid: "1",
  region: "REGION I", //array 1
  provinces: [
       {
        pid: "128", 
        province: "ILOCOS NORTE", //array 2
        cities[
              "Adams", //array 3
              "Bacarra"
             ],
       "ILOCOS SUR"
      ]
 },
 {
  rid: "2",
  region: "REGION II",
  provinces: [
       "BATANES",
       "CAGAYAN"
      ]
 }

]