2016-03-05 5 views
-3

Я попытался обработать ответы JSON со сложной структурой, и я не знаю, как управлять им после нескольких попыток.построить ответ json с php

Ответ JSON должен быть такой:

"note": { 
     "vote": 3, 
     "items":[ 
     { 
      "value": 1, 
      "touchArea": { 
       "x": 122, 
       "y": 173, 
       "w": 89, 
       "h": 89 
      } 
     }, 
     { 
      "value": 2, 
      "touchArea": { 
       "x": 122, 
       "y": 283, 
       "w": 89, 
       "h": 89 
      } 
     }, 
     { 
      "value": 3, 
      "touchArea": { 
       "x": 122, 
       "y": 390, 
       "w": 89, 
       "h": 89 
      } 
     } 
     ] 

Примечание: «голос» является максимальным значением массива

В качестве источника, я прошу MYSQL и я получаю этот массив ($ касания) :

Array ([0] => V:1,X:122,Y:173,W:89,H:89 [1] => V:2,X:122,Y:283,W:89,H:89 [2] => V:3,X:122,Y:390,W:89,H:89) 

Мой вопрос: Как создать этот ответ JSON из PHP с петлями, в этом примере мы имеем только три значения, но это может быть и больше.

+1

Является ли каждый элемент строкой; например: 'V: 1, X: 122, Y: 173, W: 89, H: 89'? –

ответ

0

Вы можете использовать следующие функции для редактирования и повторного сохранения ваших данных из json файла или строки.

<?php 
    $sInFile = 'in2.json'; 
    $sOutFile = 'out2.json'; 

    $aDevelopers = array(); 
    $aArtists = array(); 
    $aCooks  = array(); 

    $sRaw  = file_get_contents($sInFile); 
    var_dump($sRaw); 
    // object 
    $oData = json_decode($sRaw); 
    //array 
    $aData = json_decode($sRaw, 1); 
    $aNote = $aData[ 'note' ]; 
    $aItems = $aNote[ 'items' ]; 
var_dump($aData); 
    $iCountData = count($aItems); 
    // Loops through items and set new values. 
    for($i = 0; $i < $iCountData; ++$i) 
    { 
     $aItem = $aItems[ $i ]; 
     $aItem[ 'value' ] = 'newvalue'; 
     $aItem[ 'touchArea' ][ 'x' ] = 3455; 
     $aItem[ 'touchArea' ][ 'y' ] = 43; 
     $aItems[ $i ] = $aItem; 
    } 
    $aNote[ 'items' ] = $aItems; 
    $aData[ 'note' ] = $aNote; 
var_dump($aData); 
    $sNewJson = json_encode($aData); 

    file_put_contents($sOutFile, $sNewJson); 
?> 
0

Предполагая, что ваш результирующий набор из MySQL представляет собой массив строк, как это подразумевается в вашем вопросе, вы должны будете перебирать этот результирующий набор, разделить строку на ,, а затем на : до массирования данных в структуру, которую вы хотите, прежде чем, наконец, перейти на json.

Следующие должны работать для вас с учетом информации, которую вы предоставили:

<?php 

// your initial result set from mysql - an array of strings 

$touch = [ 
    'V:1,X:122,Y:173,W:89,H:89', 
    'V:2,X:122,Y:283,W:89,H:89', 
    'V:3,X:122,Y:390,W:89,H:89', 
]; 

// map over each element in your result set... 

$items = array_map(function($item) { 

    $array = []; 

    // first, break each string on `,` to 
    // get an array of elements; e.g: 
    // ['V:1', 'X:122', 'Y:173', 'W:89', 'H:89'] etc. 

    $itemElements = explode(',', $item); 

    // then, iterate over these elements... 

    foreach ($itemElements as $itemElement) { 
     // explode on `:` and assign as a key value pair 
     list($key, $value) = explode(':', $itemElement); 
     // then, check the key and add the 
     // value to the array as appropriate 
     if ('V' === $key) { 
      $array['value'] = $value; 
     } else { 
      $array['touchArea'][strtolower($key)] = $value; 
     } 
    } 

    return $array; 

}, $touch); 

// then, build the `$note` array... 

$note = [ 
    'note' => [ 
     'vote' => count($items), 
     'items' => $items, 
    ] 
]; 

// finally, json encode 

echo json_encode($note, JSON_PRETTY_PRINT); 

Это дает:

{ 
    "note": { 
     "vote": 3, 
     "items": [ 
      { 
       "value": "1", 
       "touchArea": { 
        "x": "122", 
        "y": "173", 
        "w": "89", 
        "h": "89" 
       } 
      }, 
      { 
       "value": "2", 
       "touchArea": { 
        "x": "122", 
        "y": "283", 
        "w": "89", 
        "h": "89" 
       } 
      }, 
      { 
       "value": "3", 
       "touchArea": { 
        "x": "122", 
        "y": "390", 
        "w": "89", 
        "h": "89" 
       } 
      } 
     ] 
    } 
} 

Надеется, что это помогает :)

0

Решение с array_map, explode, array_column и max:

$touch = ["V:1,X:122,Y:173,W:89,H:89", "V:2,X:122,Y:283,W:89,H:89", "V:3,X:122,Y:390,W:89,H:89"]; 

$result_arr = ["note" => ["vote" => 0, "items" => []]]; // basic structure 

array_map(function($v) use (&$result_arr){ 
    $arr = explode(",", $v); 
    $result = []; 
    foreach ($arr as $value) { 
     $new_arr = explode(":", $value); 
     $key = strtolower($new_arr[0]); 
     if ($key == "v"){ 
      $result["value"] = $new_arr[1]; 
     } else { 
      $result["touchArea"][$key] = $new_arr[1]; 
     } 
    } 
    $result_arr["note"]["items"][] = $result; 
}, $touch); 

// getting max vote 
$result_arr["note"]["vote"] = max(array_column($result_arr["note"]["items"], "value")); 

$final_json = json_encode($result_arr, JSON_PRETTY_PRINT); 
+0

Thx для справки. Это будет работать с PHP5? Причина, то есть $ result_arr = ["note" => ["vote" => 0, "items" => []]]; недействительно с PHP5 – Rodolphe

+0

Вы забыли о версии. Этот фрагмент кода действителен для PHP5 в целом. Начиная с PHP 5.4 вы также можете использовать синтаксис короткого массива. Начиная с PHP 5.5 вы можете использовать большую функцию 'array_column'. Обновите сегодня и «подстригите паруса к ветру». (У нас уже есть PHP 7.0.4) (мой код работает без проблем) – RomanPerekhrest

+0

Thx. Это окончательно помогает! – Rodolphe