2016-12-17 3 views
1

У меня есть это сложное JSON, которое я хочу проанализировать в PHP, чтобы я мог построить dropdown.как разбирать вложенные JSON в PHP

Я хочу построить раскрывающимися

<select name="select-box"> 
    <option value="apple">apple</option> 
    <option value="banana">banana</option> 
    <option value="kiwi">kiwi</option> 
</select> 

Прямо сейчас я делаю что-то вроде этого, не работает

$json = '[ 
    { 
     "class":"autocomplete", 
     "name":"autocomplete-1481957691348-preview", 
     "value":"there is nothing like me", 
     "id":"autocomplete-1481957691348-preview", 
     "type":"autocomplete", 
     "tag":"INPUT" 
    }, 
    { 
     "class":"form-control", 
     "name":"file-1481957721195-preview", 
     "value":"", 
     "id":"file-1481957721195-preview", 
     "type":"file", 
     "tag":"INPUT" 
    }, 
    { 
     "select-box":[ 
     { 
      "selectName":"apple", 
      "optionValue":"apple" 
     }, 
     { 
      "selectName":"banana", 
      "optionValue":"banana" 
     }, 
     { 
      "selectName":"kiwi", 
      "optionValue":"kiwi" 
     } 
     ] 
    }, 
    { 
     "class":"form-control", 
     "name":"select-1481957826542-preview", 
     "value":"jadu", 
     "id":"select-1481957826542-preview", 
     "type":"select", 
     "tag":"SELECT" 
    } 
]'; 

Мой интерес это object свыше JSON

{ 
      "select-box":[ 
      { 
       "selectName":"apple", 
       "optionValue":"apple" 
      }, 
      { 
       "selectName":"banana", 
       "optionValue":"banana" 
      }, 
      { 
       "selectName":"kiwi", 
       "optionValue":"kiwi" 
      } 
      ] 
     } 

Но я не хочу, чтобы parse th отдельно. Вместо этого я хочу, чтобы разобрать в целом JSON

$arrData = json_decode($json); 
    echo '<select name=''>'; 
    foreach($arrData as $key=>$objData){ 
     echo '<option value='".$objData->selectName."'>'.$objData->selectName.'</option>'; 
    } 
echo '</select>'; 
+0

Что вы хотите отобразить в теге select? – Ionut

+0

Мне нужно отобразить второй код json, показанный в коде, но его структура должна быть как 1-й json –

ответ

1

Вы могли бы передать истинный как второй параметр json_decode, чтобы вернуть данные в виде массивов, а не объектов. Тогда вы могли бы сделать следующее:

// Decode all of the JSON string and store into variable 
$decodedJson = json_decode($json, true); 

// Retrieve only the select box related data from all of the decoded JSON data 
$selectOptions = $decodedJson[2]['select-box']; 

echo '<select name="">'; 

foreach($selectOptions as $selectOption) { 
    echo '<option value="'.$selectOption['selectName'].'">'.$selectOption['selectName'].'</option>'; 
} 

echo '</select>'; 

Также я скопировал то, что вы сделали, где вы использовали значение «selectName» на каждую опции в качестве выбора значения параметра коробки, а также имя. Не уверен, что вы хотите изменить его, чтобы вместо этого использовать значение «optionValue», но я думал, что подниму его на всякий случай.

Надеюсь, это поможет!

+0

, но моя структура json будет динамически меняться –

+0

В каком смысле? Какие проблемы это вызовет? –

+0

этот '$ selectOptions = $ decodedJson [2] ['select-box'];' не будет работать для значений 'dynamic'. –

2

Вы были некоторые ошибки в коде, как:

echo '<select name=''>';

должно быть:

echo '<select name="">';

Вы можете преобразовать объект в массив и разобрать его, как это:

<?php 
$json = '[ 
    { 
     "class":"autocomplete", 
     "name":"autocomplete-1481957691348-preview", 
     "value":"there is nothing like me", 
     "id":"autocomplete-1481957691348-preview", 
     "type":"autocomplete", 
     "tag":"INPUT" 
    }, 
    { 
     "class":"form-control", 
     "name":"file-1481957721195-preview", 
     "value":"", 
     "id":"file-1481957721195-preview", 
     "type":"file", 
     "tag":"INPUT" 
    }, 
    { 
     "select-box":[ 
     { 
      "selectName":"apple", 
      "optionValue":"apple" 
     }, 
     { 
      "selectName":"banana", 
      "optionValue":"banana" 
     }, 
     { 
      "selectName":"kiwi", 
      "optionValue":"kiwi" 
     } 
     ] 
    }, 
    { 
     "class":"form-control", 
     "name":"select-1481957826542-preview", 
     "value":"jadu", 
     "id":"select-1481957826542-preview", 
     "type":"select", 
     "tag":"SELECT" 
    } 
]'; 

$arrData = json_decode($json, true); 
    echo '<select name="">'; 
    foreach($arrData as $objData){ 
     $for_select = $objData['select-box']; 
     if(is_array($for_select)){ 
      foreach($for_select as $sel){ 
       echo '<option value="'.$sel['selectName'].'">'.$sel['selectName'].'</option>'; 
      } 
     } 
    } 
    echo '</select>'; 
+0

Одиночные кавычки могут содержать одинарные кавычки, если они экранированы – Fabio

+0

Да. Но не в случае OP. Не нужно бежать. – Ionut

+0

Конечно, но вы указали, что «Одиночные кавычки не могут содержать одинарные кавычки». Это ложь, если вы их избегаете. – Fabio

2

У вас есть какая-то ошибка в кавычках, а также вам нужно перебирать в вашей вложенной JSON, если it'not пуст, как следовать

$arrData = json_decode($json); 
echo '<select name="Select-box">'; 
foreach($arrData as $key=>$objData){ 
    if(!empty($objData->{'select-box'})) { 
      foreach($objData->{'select-box'} as $select){ 

       echo '<option value="'.$select->optionValue.'">'.$select->selectName.'</option>'; 
      } 
    } 
} 
echo '</select>'; 

//print 
//<select name="select-box"><option value="apple">apple</option><option value="banana">banana</option><option value="kiwi">kiwi</option></select> 

live sample

Если вы не знаете имя свойства, потому что изменений вы все время может сделать как следовать

$arrData = json_decode($json); 
echo '<select name="select-box">'; 
foreach($arrData as $key=>$objData){ 
    foreach($objData as $data) { 
     if(is_array($data)) { 
      foreach($data as $select){ 

        echo '<option value="'.$select->optionValue.'">'.$select->selectName.'</option>'; 
      } 
     } 
    } 
} 

live sample

+0

, если в этом сценарии есть' dynamic' для 'select-box', как это сделать. например, вместо 'select-box' это' veg', тогда как я могу сделать это динамически –

+0

@DilipG я обновил свой ответ в качестве вашего запроса – Fabio

0
$arrData = json_decode($json, TRUE); 
echo '<select name="">'; 
foreach($arrData as $key=>$objData){ 
    foreach($objData['select-box'] as $key2=>$objData2){ 
       echo '<option value='.$objData2['optionValue'].'>'.$objData2['selectName'].'</option>'; 
    } 
} 
echo '</select>'; 
Смежные вопросы