Как сгруппировать идентификатор в цикле while (для php json_encode)

0

У меня есть проблема в течение нескольких дней, чтобы создать массив Json с данными MySQL

Вот мои данные 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
            }
         ]
      }
   ]
}

Я не могу изолировать каждый идентификатор зон, чтобы правильно построить мой JSON....

Можно ли использовать каждый идентификатор один раз в цикле while?

любая помощь

Извините за мой плохой английский..: S

Joel

  • 0
    Вы используете mysqli не PDO верно? Просто глядя на это, это довольно грязно. Здесь происходит много разной путаницы. Подобно этому циклу foreach ($json_response as $element) только запутывает проблему. вы сбрасываете эту переменную $json_response = [ ... ] при каждом изменении цикла, не уверены, что это предусмотрено.
  • 0
    Формат, в котором вы его хотите, выглядит недействительным, в частности, здесь "zn":"Zone 1"{ Может быть, это просто опечатка, но вложена ли она в этот элемент?
Показать ещё 10 комментариев
Теги:
arrays
loops

1 ответ

0
Лучший ответ

Хорошо, вот как я это сделаю. Это немного другая структура, но одна, которая упрощает сборку.

Также я не использую базу данных, поэтому я буду использовать этот законченный массив

 $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 ниже вы можете заменить с в while циклы из базы данных до тех пор, пока данные в $data в строке, она должна быть тонкой.

  $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;

Вы можете проверить его здесь.

Выход

 {
    "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. Способ решения заключается в том, чтобы выводить данные в массив, сгруппированный по идентификатору зоны, а затем зацикливать. Поэтому нам нужно было бы построить то, что у меня было выше, как этап 1, а затем, когда они сгруппированы, правильно удалите ключ zone существу.

Как я уже упоминал в комментариях, есть ошибка в формате, который вы хотите в конце всего этого. Это прямо здесь

"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"
                }
            ]
        }
    ]   
}

Вы можете видеть это онлайн здесь. Но поскольку мы поддерживали структуру в руке, мы получаем преимущество, заключающееся в том, что они ключом ($ zon var)

  • 0
    Работает отлично !!! Большое спасибо !! В результате поиска .... я заблудился в чем-то слишком сложном .... Ваш код идеально подходит для моих нужд. Спасибо 1000x!
  • 0
    И это всего лишь 15-20 строк. Мне нравятся такие вопросы, для меня это как головоломка. ха ха
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню