如果同一个孩子有多个父母,如何从多维数组中列出父子关系

时间:2016-01-10 05:19:01

标签: php arrays

我有mysql查询,它会将数据从tbl_posts作为数组返回。该数组显示它们之间的父子关系,如下所示

$tree = array(
       'C1' => 'P1',//C1 is the child of P1
       'C2' => 'P1',//C2 is the child of P1
       'C3' => 'P2',//C3 is the child of P1
       'C4' => 'P3',//C4 is the child of P1
       'GC1' => 'C1',//GC1 is the child of C1
       'GC1' => 'C2',//GC1 is the child of C2
       'GC2' => 'C1',//GC2 is the child of C1
       'GC2' => 'C2',//GC2 is the child of C2
       'GC2' => 'C4',//GC2 is the child of C4

       'P1' => null,//parent post P1
       'P2' => null,//parent post  P2
       'P3' => null,//parent post P3
    );

这里P1,P2,P3是父帖子,C1,C2,C3 ..是子帖子,GC1,GC2,GC3 ...是根据查询返回的数组的大孩子。 我想根据父子关系列出这些数据,如下所示

- P1
  -- C1
    --- GC1
    --- GC2

  -- C2
    --- GC1
    --- GC2 

- P2
  -- C3

-P3
  -- C4
    --- GC2

我已经尝试过以下代码

   function parseTree($tree, $root = null) {
   $return = array();
   foreach($tree as $child => $parent) {
       if($parent == $root) {
          $return[] = array(
            'parent' => $child,
            'child' => parseTree($tree, $child)
        );
      }
   }
  return empty($return) ? null : $return;    
}

function printTree($tree) {
if(!is_null($tree) && count($tree) > 0) {
    echo '<ul>';
    foreach($tree as $node) {
        echo '<li>'.$node['parent'];
        printTree($node['child']);
        echo '</li>';
    }
    echo '</ul>';
  }
}

$result = parseTree($tree);

echo "<pre>";
printTree($result);

我得到的结果如下

P1
    C1
    C2
      GC1

P2
    C3

P3
    C4
      GC2

大孩子只列出一次。 GC1,GC2和GC3是C1,C2和C3的子代,但它们仅列出一次。如果同一个孩子在这种情况下有多个父母,我如何列出父子关系?谢谢。

1 个答案:

答案 0 :(得分:1)

在您的示例中,您在数组中定义重复键GC1属于单个父级(C2),因为GC1 =&gt; C2覆盖了之前的条目。

如果您改变阵列结构以防止覆盖密钥,您应该看到孩子在父母双方都列出。