2013-08-30 11 views
0

Недавно я опубликовал этот вопрос (Nested Lists in PHP and MySQL) о том, как создать вложенный неупорядоченный список с использованием PHP и MySQL.Вложенные данные JSON от MySQL

С некоторой помощью я действительно сумел решить это сам (без сомнения, извиваясь и неэффективно - см. Решение).

Теперь мне нужна точно такая же вложенная структура из MySQL, но в JSON.

Может ли кто-нибудь сказать мне, как это сделать?

Я планировал построить многомерный массив, а затем преобразовать его в JSON с json_encode. Должен ли я повторно использовать структуру foreach, которую я использовал для решения моей предыдущей проблемы, или есть более простой способ (учитывая, что мне не нужно беспокоиться о закрытии списков и подписок и т. Д.)?

+0

В случае, если вам это нужно на стороне клиента, вы можете получить JSON с JavaScript из сформированного дерева тоже. – Davit

ответ

0

json_encode - это, безусловно, лучший способ, чем ваше предыдущее решение. Примером может быть, как это, возможно,

$mainarray = array(); 

foreach($items as $k => $v) 
{ 
    array_push($v,$mainarray); 
} 
echo json_encode($mainarray); 
0

см это может помочь вам

function makenestedarray($array,$model) { 
    // check if array is a mysql result; if so, convert it to a flat array 
    $array = gettype($array)=='resource' ? convertquerytoarray($array) : $array; 
    // set blank index for tracking which rows we've already added 
    $idx = ''; 
    // blank array to store all the data 
    $master = array(); 
    // retrieve value of "key" for the current iteratin of the data model 
    $key = $model['key']; 
    // loop over each row in the passed data array 
    foreach($array as $row) { 
     // if the value is not equal to the index value, evaluate row 
     if($row[$key] != $idx) { 
     // retrieve data for row based on model definition 
     $item = makerowdata($row,$model); 
     // if current level has "children" defined, evaluate each child 
     if(isset($model['children'])) { 
      // loop over array of children 
      foreach($model['children'] as $child=>$val) { 
      // whittle it down based on the child's data key 
       $childarr = filterarraybykey($array,$key,$row[$key]); 
       // recursively call makenestedarray() 
       $children = makenestedarray($childarr,$val); 
       // add nested data to parent array 
       $item[$child]=$children; 
      } 
     } 
     // done with all the looping; add current data item to master array 
     array_push($master,$item); 
     // update the index and kip rows if they have the same index 
     $idx = $row[$key]; 
     } 
    } 
    // yay! all finished; return the completed data object 
    return $master; 
} 

function makerowdata($row,$struct) { 
    $columns = array(); 
    $keys = array_keys($struct); 
    foreach($keys as $pos=>$key) { 
     if($key != 'key' && $key != 'children') { 
     $columns[$struct[$key]] = $row[$key]; 
     } 
    } 
    return $columns; 
} 

$model = array(
    'key'=>'group', 
    'group'=>'group', 
    'groupid'=>'id', 
    'children'=>array(
     'categories'=>array(
     'key'=>'category', 
     'category'=>'category', 
     'children'=>array(
     'names'=>array(
      'key'=>'names', 
      'nameid'=>'id', 
      'name'=>'name' 
     ) 
    ) 
    ) 
); 
$data = makenestedarray($sqlresult,$model); 
$returnjson = array("groups" => $data); 
// serialize this mug, and return the string 
return json_encode($returnjson); 

для more see here

+0

Прежде всего, спасибо за отличный ответ. Однако, я думаю, это может быть слишком сложно для моей цели. Я вытаскиваю некоторые результаты MySQL, которые включают в себя три столбца (называемые для этих целей «верхний уровень», «второй уровень» и «третий уровень»). Данные в них не связаны друг с другом в структуре данных. Итак, чтобы превратить его во вложенный список, я использовал несколько флагов и перемещался по строкам, начиная новый под-список, если появился новый элемент (см. Мое «решение» для моего предыдущего вопроса). По сути, я хотел бы сделать то же самое здесь, но вместо этого добавить к массиву ... – davidofyork

Смежные вопросы