2016-03-14 2 views
0

У меня возникли проблемы с созданием многомерного объекта JSON в PHP.Создание многомерного объекта json из базы данных

база

Мой Postgresql выглядит следующим образом:

Id  Name  Parent 
1   Active  NULL 
2   Passive  NULL 
3   Fixed  1 
4   Dynamic  3 
5   Taxes  2 
6   Fair  2 
... 

Родитель столбец связан с идентификатором в первом столбце

Что я хочу сделать это:

[ 
    { 
    "name": "Active", 
    "children": [ 
     { 
     "name": "Fixed", 
     "children": [ 
      { 
      "name": "Dynamic", 
      "children": NULL 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "name": "Passive", 
    "children": [ 
     { 
     "name": "Taxes", 
     "children": NULL 
     }, 
     { 
     "name": "Fair", 
     "children": NULL 
     } 
    ] 
    } 
] 

Так в первую очередь i FETCH данные из нашей базы данных с

$result = fetchAll(PDO::FETCH_OBJ); // fetches every row in an object 

Я мог бы отправить этот результат во внешний интерфейс (javascript) и преобразовать эти данные в JSON, но затем я отправлю им имена столбцов, и я не думаю, что это хорошая идея в условиях безопасности.

Прежде всего, я хочу сделать верхний уровень файла JSON. С помощью этой темы Object to array in PHP я умудряюсь положить, что вместе:

$mainArray = []; 
foreach ($result as $value) { 
    if ($value['Parent'] === NULL) { 
     $object = new stdClass(); 
     $object->name = $value['Name']; 
     $object->children = []; 
     $mainArray[] = $object; 

    } 
} 

Это мой результат:

[ 
    { 
     name: "Actief", 
     children: [ ] 
    }, 
    { 
     name: "Passief", 
     children: [ ] 
    } 
] 

Но я застрял при добавлении детей к правильному родителю. Я просто не могу найти, как это сделать.

мне нужно сделать что-то вроде этого:

Добавить Fixed в Object где Object->Name является 1 = Active.

ответ

1

Это сделает эту работу. Предполагая, что ваши дочерние данные не будут поступать до ваших родительских данных.

$mainArray = []; 
foreach ($result as $key=>$value) { 
     if ($value['Parent'] === NULL) { 
     $object = new stdClass(); 
     $object->name = $value['Name'];   
     $mainArray[$value['Id']] = $object;  
     }else{ 
     $childOBJ = new stdClass(); 
     $childOBJ->name = $value['Name']; 
     $mainArray[$value['Parent']]->children[] = $childOBJ; 

     } 

    } 
$finalArray = array_values($mainArray); // changes to indexed array for json purpose 

UPDATE: С рекурсии и refrence

function makeTree($result, $parentId=NULL){ 
    $tree = []; 
    foreach ($result as $value) { 
     if($value['Parent'] == $parentId){ 
     $object = new stdClass(); 
     $object->name = $value['Name']; 
     $child = makeTree($result, $value['Id']); 
      if($child){ 
      $object->children=$child;       
     } 
     $tree[] = $object; 
    }    
    }  
    return $tree;    
} 
$finalArray = makeTree($result); 
+0

Thx! Он работает на 75%, потому что, как вы можете видеть в моем примере, у некоторых детей может быть ребенок, и у них могут быть дети и ... Вы знаете, куда я хочу пойти, это может пойти в разы. Теперь он дает «Все» ребенка на одном уровне. – Peter

+0

Хорошо. Обновлен мой ответ с рекурсией. –

+0

Приятно, вот и все! большое спасибо – Peter

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