【问题标题】:How to group ID in while loop (for php json_encode)如何在 while 循环中对 ID 进行分组(用于 php json_encode)
【发布时间】:2018-09-09 21:40:16
【问题描述】:

困扰了好几天用MySQL数据创建Json数组

这是我的 MySQL 数据:

zi  zn         vn                       pioo     pio     ve    station    es       eo  

 1  Zone 1     Value 01                  1     199       0        1       1         0
 1  Zone 1     Value 02                 54     637       0        3       0         0
 1  Zone 1     Value 03                 55     637       1        3       0         0
 2  Zone 2     Value 01                  1     199       0        1       1         0
 2  Zone 2     Value 03                 55     637       1        3       0         0
 2  Zone 2     Value 04                 56     642       0        3       0         0
 3  Zone 3     Value 01                  1     199       0        1       1         0
 3  Zone 3     Value 05                 57     647       1        3       0         0
 4  Zone 4     Value 05                 57     647       1        3       0         0
 5  Zone Test  Value 02                 54     637       0        3       0         0
 5  Zone Test  Value 03                 55     637       1        3       0         0

这是我的 PHP 代码:

我的查询是 $query,我的 SQL 连接是 $con

$result = array();
$json_response = array();
$response = array();


if($stmt = $con->prepare($query)){
    $stmt->execute();

    $stmt->bind_result($zoneId,$zoneName,$vanneName,$piooId,$pioId,$vanne_etat,$station,$etat_station,$etat_ordre);

    while($stmt->fetch()){


            $json_response = [
                    'zi' => $zoneId,
                'zn' => $zoneName,
                $vanneName => [],
            ];

        $json_response[$vanneName][] = [
            'pioo' => $piooId,
            'pio' => $pioId,
            've' => $vanne_etat,
            'es' => $etat_station,
            'eo' => $etat_ordre,
        ];



    $data = [];
    foreach ($json_response as $element) {
        $data[] = $element;
    }

        $result[]=$json_response;


    }
    $stmt->close();


    $online = mysqli_fetch_array(mysqli_query($con, "SELECT CASE WHEN TIMESTAMP > DATE_SUB(NOW(), INTERVAL 5 MINUTE) THEN 1 ELSE 0 END AS online FROM relevés_instantanés ORDER BY ID DESC LIMIT 1")) ['online'];
    $response["online"] = $online;
    $response["success"] = 1;
    $response["data"] = $result;


}else{
    //Errors
    $response["success"] = 0;
    $response["message"] = mysqli_error($con);


}

mysqli_close($con);
echo json_encode($response);

像这样输出Json:

{
   "online":"1",
   "success":1,
   "data":[
      {
         "zi":1,
         "zn":"Zone 1",
         "Value 01":[
            {
               "pioo":1,
               "pio":199,
               "ve":0,
               "es":1,
               "eo":0
            }
         ]
      },
      {
         "zi":1,
         "zn":"Zone 1",
         "Value 02":[
            {
               "pioo":54,
               "pio":637,
               "ve":0,
               "es":0,
               "eo":0
            }
         ]
      },
      {
         "zi":1,
         "zn":"Zone 1",
         "Value 03":[
            {
               "pioo":55,
               "pio":637,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      },
      {
         "zi":2,
         "zn":"Zone 2",
         "Value 01":[
            {
               "pioo":1,
               "pio":199,
               "ve":0,
               "es":1,
               "eo":0
            }
         ]
      },
      {
         "zi":2,
         "zn":"Zone 2",
         "Value 03":[
            {
               "pioo":55,
               "pio":637,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      },
      {
         "zi":2,
         "zn":"Zone 2",
         "Value 04":[
            {
               "pioo":56,
               "pio":642,
               "ve":0,
               "es":0,
               "eo":0
            }
         ]
      },
      {
         "zi":3,
         "zn":"Zone 3",
         "Value 01":[
            {
               "pioo":1,
               "pio":199,
               "ve":0,
               "es":1,
               "eo":0
            }
         ]
      },
      {
         "zi":3,
         "zn":"Zone 3",
         "Value 05":[
            {
               "pioo":57,
               "pio":647,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      },
      {
         "zi":4,
         "zn":"Zone 4",
         "Value 05":[
            {
               "pioo":57,
               "pio":642,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      },
      {
         "zi":5,
         "zn":"Zone Test",
         "Value 02":[
            {
               "pioo":54,
               "pio":637,
               "ve":0,
               "es":0,
               "eo":0
            }
         ]
      },
      {
         "zi":5,
         "zn":"Zone Test",
         "Value 03":[
            {
               "pioo":55,
               "pio":637,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      }
   ]
}

但我希望得到这样的输出:(我不确定语法,但您可以理解我的愿望。)

{
   "online":"1",
   "success":1,
   "data":[
      {

         "zi":1,
         "zn":"Zone 1"{
         "Value 01":[
                {
                   "pioo":1,
                   "pio":199,
                   "ve":0,
                   "es":1,
                   "eo":0
                }
             ]
             "Value 02":[
                {
                   "pioo":54,
                   "pio":637,
                   "ve":0,
                   "es":0,
                   "eo":0
                }
             ]
             "Value 03":[
                {
                   "pioo":55,
                   "pio":637,
                   "ve":1,
                   "es":0,
                   "eo":0
                }
             ]
          },


      {
         "zi":2,
         "zn":"Zone 2"{
         "Value 01":[
            {
               "pioo":1,
               "pio":199,
               "ve":0,
               "es":1,
               "eo":0
            }
         ]
         "Value 03":[
            {
               "pioo":55,
               "pio":637,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]

         "Value 04":[
            {
               "pioo":56,
               "pio":642,
               "ve":0,
               "es":0,
               "eo":0
            }
         ]
      },

      {
         "zi":3,
         "zn":"Zone 3"{
         "Value 01":[
            {
               "pioo":1,
               "pio":199,
               "ve":0,
               "es":1,
               "eo":0
            }
         ]
         "Value 05":[
            {
               "pioo":57,
               "pio":647,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      },


      {
         "zi":4,
         "zn":"Zone 4"{
         "Value 05":[
            {
               "pioo":57,
               "pio":642,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      },


      {
         "zi":5,
         "zn":"Zone Test"{
         "Value 02":[
            {
               "pioo":54,
               "pio":637,
               "ve":0,
               "es":0,
               "eo":0
            }
         ]
         "Value 03":[
            {
               "pioo":55,
               "pio":637,
               "ve":1,
               "es":0,
               "eo":0
            }
         ]
      }
   ]
}

我无法隔离 Zones 的每个 id 以正确构建我的 JSON ....

是否可以在 while 循环中使用每个 ID 一次?

任何帮助表示赞赏

对不起我的英语不好..:S

乔尔

【问题讨论】:

  • 您使用的是mysqli 而不是PDO 对吗?光看一眼,就觉得很乱。有很多可变的混乱正在发生。像这个循环foreach ($json_response as $element) 只是混淆了这个问题。您在每次循环迭代时重置此变量 $json_response = [ ... ],不确定是否有意。
  • 你想要的格式,看起来无效,这里特别是"zn":"Zone 1"{ 可能只是一个错字,但它是否嵌套在那个元素中?
  • 是的,我正在使用 mysqli。我知道这很混乱......我尝试了几天......没有任何成功......我有点迷茫......因此我寻求帮助......
  • 一切都很好,您提供了相当多的信息。我只需要对它进行排序,这样我就可以弄清楚你想要什么。可能我们将不得不做 2 个循环。如果是PDO,我们可以使用FETCH_GROUP 并将结果分组到Zone。这样会更容易。
  • 为了更清楚:我想用它的名字('zn')和相应的数据来隔离每个'zi'。 (值 xx、pioo、pio 等 ..)。我不太了解 PDO,因为我从未使用过它……我通常对 mysqli 感到满意

标签: php mysql arrays json loops


【解决方案1】:

好的,我就是这样做的。它的结构略有不同,但更易于构建。

另外我没有使用数据库,所以我将使用这个固定数组

 $a = [
    [
        "zi"        => "1",
        "zn"        => "Zone 1",
        "vn"        => "Value 01",
        "pioo"      => "1",
        "pio"       => "199",
        "ve"        => "0",
        "station"   => "1",
        "es"        => "1",
        "eo"        => "0"
    ],  [
        "zi"        => "1",
        "zn"        => "Zone 1",
        "vn"        => "Value 02",
        "pioo"      => "54",
        "pio"       => "637",
        "ve"        => "0",
        "station"   => "3",
        "es"        => "0",
        "eo"        => "0"
    ],[
        "zi"        => "2",
        "zn"        => "Zone 2",
        "vn"        => "Value 04",
        "pioo"      => "56",
        "pio"       => "642",
        "ve"        => "0",
        "station"   => "3",
        "es"        => "0",
        "eo"        => "0"
    ]
 ];

如果我在下面有foreach,只要数据在每行$data 中,您就可以用数据库中的while 循环替换,应该没问题。

  $output = [
      "online" => 0,
      "success" => 0,
      "data" => []
   ];

 foreach($a as $data){ 
   //replace foreach with while from the DB
   //eg. while(false != ($data = $stmt->fetch_assoc())){


    $zone = "zone_{$data['zi']}";
    if(!isset($output['data'][$zone])){
        //setup the zone first time we see it
        $output['data'][$zone] = [
            "zi" => $data['zi'],
            "zn" => $data['zn'],
        ];
    }
    
    $value = $data['vn'];
    
    if(!isset($output['data'][$zone][$value])) $output['data'][$zone][$value] = [];

    //remove these we don't want them anymore
    unset($data['zi'], $data['zn'], $data['vn']);
    
    $output['data'][$zone][$value][] = $data;
     
 }
 $output["online"] = 1;
 $output["success"] = 1;

你可以在线测试here

输出

 {
    "online": 1,
    "success": 1,
    "data": {
        "zone_1": {
            "zi": "1",
            "zn": "Zone 1",
            "Value 01": [
                {
                    "pioo": "1",
                    "pio": "199",
                    "ve": "0",
                    "station": "1",
                    "es": "1",
                    "eo": "0"
                }
            ],
            "Value 02": [
                {
                    "pioo": "54",
                    "pio": "637",
                    "ve": "0",
                    "station": "3",
                    "es": "0",
                    "eo": "0"
                }
            ]
        },
        "zone_2": {
            "zi": "2",
            "zn": "Zone 2",
            "Value 04": [
                {
                    "pioo": "56",
                    "pio": "642",
                    "ve": "0",
                    "station": "3",
                    "es": "0",
                    "eo": "0"
                }
            ]
        }
    }
}

如您所见,它与您想要的格式非常接近,但通过在其中添加 $zone = "zone_{$data['zi']}";,我们可以更好地跟踪事情。

//php
$output['data'][$zone];

//json
"data": {
    "zone_1"

否则,我们必须先按区域对它们进行分组,然后在第二个循环中将它们写出来。正如您所说I can not isolate each id of Zones to correctly build my JSON 解决该问题的方法是将数据输出到按区域ID 分组的数组,然后循环。因此,我们必须在第 1 阶段构建我上面所拥有的内容,然后一旦它们被正确分组,基本上就删除了 zone 键。

正如我在 cmets 中提到的,在所有这些结束时,您想要的格式存在错误。就在这里

"zn":"Zone 1"{   //<--- this bracket
     "Value 01":[
            {
    ...

所以我不知道这是否只是一个错字,或者这是否应该是结构的一部分(我只是忽略了它)。

更新

我突然想到了一个简单的方法来删除我添加的$zone 键。您可以简单地使用array_values 来删除键。如下所示,在将其编码为 JSON 之前添加该行。

 $output['data'] = array_values($output['data']);

这会将结构更改为

 {
    "online": 1,
    "success": 1,
    "data": [
        {
            "zi": "1",
            "zn": "Zone 1",
            "Value 01": [
                {
                    "pioo": "1",
                    "pio": "199",
                    "ve": "0",
                    "station": "1",
                    "es": "1",
                    "eo": "0"
                }
            ],
            "Value 02": [
                {
                    "pioo": "54",
                    "pio": "637",
                    "ve": "0",
                    "station": "3",
                    "es": "0",
                    "eo": "0"
                }
            ]
        }
    ]   
}

你可以在网上看到 here 但是因为我们事先在结构中提供了支持,所以我们获得了通过键($zon var)识别它们的优势

【讨论】:

  • 完美运行!!!非常感谢 !!通过搜索....我迷失在太复杂的事情中....您的代码非常适合我的需要。谢谢你 1000 倍!
  • 而且它只有 15 - 20 行。我喜欢这类问题,这对我来说就像一个谜。哈哈。
  • 你似乎很了解 PHP。非常感谢您分享您的经验!我对阵列不太满意。我还要练习几年... :-)
  • 我只做 PHP 10 年,专业 8 年。时间飞逝。这就是为什么我试图解释它是如何工作的,所以希望它更有意义。数组键是唯一的,因此您可以将它们用于各种快捷方式。
  • 好吧,我明白了 :-) 网上有你这样的人帮助初学者真是太好了!!
猜你喜欢
  • 2011-10-21
  • 2011-07-27
  • 1970-01-01
  • 2015-01-06
  • 2021-01-30
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多