如何通过JSON递归循环以创建父/子对象PHP

时间:2019-06-13 14:59:22

标签: php arrays json

我有一个json文件,其中包含一个名为“ dialogue_nodes”的数组。数组中的每个对象都有一个“父”值和一个“ dialog_node”值。如果对话节点具有父节点的值,则该值引用另一个对话节点的“ dialogue_node”值。在json文件中,所有父节点和子节点都位于顶部dialog_nodes数组中的同一“级别”上。我目前正在手动遍历数组。

如何动态遍历数组以解决父/子关系的不确定级别?这是我当前的代码。

$content = file_get_contents( "testWorkspace.json" );

$json = json_decode( $content );
$dialogueNodes = $json->dialog_nodes;

foreach ( $dialogueNodes as $node ) {

   if ( !isset( $node->parent ) ) {

       $topNodes[] = $node;

   } else {

    $otherNodes[] = $node;
   }
}

foreach ( $topNodes as $node ) {

   echo "top: {$node->title}";

   foreach ( $otherNodes as $node2 ) {

    if ( $node2->parent == $node->dialog_node ) {

        echo "level 2 child is {$node2->dialog_node} {$node2->title}";

        foreach ( $otherNodes as $node3 ) {

            if ( $node3->parent == $node2->dialog_node ) {

                echo "level 3 child is {$node3->dialog_node} {$node3->title}";

 continues.....

这是示例输入。第一个对象是父节点示例,第二个对象是子节点

{
  "title": "Welcome",
  "dialog_node": "node_5_1550586774524",
},
{
  "condition": true
  "output": "hello"
  "parent": "node_5_1550586774524"
  "dialog_node": "node_12_1554909604222"
},

1 个答案:

答案 0 :(得分:0)

您可能正在寻找类似以下的递归函数:

foreach($topNodes as $node) {
  echo "top: {$node->title}";
  recursiveFunction($otherNodes, 1, $node->dialog_node);
}
function recursiveFunction($nodes, $level, $parent = null) {
  $level++;
  foreach($nodes as $node) {
    if ($node->parent === $parent ) {
      echo "level $level child is {$node->dialog_node} {$node->title}";
      recursiveFunction($nodes, $level, $node->dialog_node);
    }
  }
}

但是要非常小心:递归函数可能很危险,并且会陷入无限循环。