У меня есть проблема в течение нескольких дней, чтобы создать массив 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
Хорошо, вот как я это сделаю. Это немного другая структура, но одна, которая упрощает сборку.
Также я не использую базу данных, поэтому я буду использовать этот законченный массив
$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)
mysqli
неPDO
верно? Просто глядя на это, это довольно грязно. Здесь происходит много разной путаницы. Подобно этому циклуforeach ($json_response as $element)
только запутывает проблему. вы сбрасываете эту переменную$json_response = [ ... ]
при каждом изменении цикла, не уверены, что это предусмотрено."zn":"Zone 1"{
Может быть, это просто опечатка, но вложена ли она в этот элемент?