Php 通过相关实体正确递归

Php 通过相关实体正确递归,php,json,recursion,visualization,Php,Json,Recursion,Visualization,我有一套组织和他们的董事会成员。 所有组织都有董事会成员,许多董事会成员在多个组织的董事会中 我用它来说明他们之间的关系。JIT超树模式要求一个项是所有项的父项,并基于单个JSON数组绘制 我希望有重新中心事件查询,并根据更改重新填充图形。然后两个级别就可以了,但我还没有弄清楚如何做到这一点 我目前拥有的代码从开始的组织中手动递归三个级别,但我想要的是通过所有相关记录重新诅咒 因此,它将从一个组织开始,并添加组织的子成员数组(董事会成员)。然后获取每个董事会成员的所有董事会(当前组织除外),并将

我有一套组织和他们的董事会成员。 所有组织都有董事会成员,许多董事会成员在多个组织的董事会中

我用它来说明他们之间的关系。JIT超树模式要求一个项是所有项的父项,并基于单个JSON数组绘制

我希望有重新中心事件查询,并根据更改重新填充图形。然后两个级别就可以了,但我还没有弄清楚如何做到这一点

我目前拥有的代码从开始的组织中手动递归三个级别,但我想要的是通过所有相关记录重新诅咒

因此,它将从一个组织开始,并添加组织的子成员数组(董事会成员)。然后获取每个董事会成员的所有董事会(当前组织除外),并将其添加为董事会成员的子级

这将一直持续到每条线索的尽头——可能是在一个只属于一个董事会的董事会成员那里

有人对如何创建此阵列和避免重复提供建议吗

$board = $center->board();

$top['id'] = $center->ID;
$top['name'] = $center->Org;
$top['children'] = array();
if ($board) {
    foreach ($board as $b) {
        $child['id'] = $b->ID;
        $child['name'] = (strlen(trim($b->Last)) > 0) ? $b->First . ' ' . $b->Last : 'Unknown';
        $child['data']['orgname'] = $center->Org;
        $child['data']['relation'] = $b->Role;
        $child['data']['occupation'] = $b->Occupation;
        $child['children'] = array();
        $childboards = $b->boards();
        if ($childboards) { foreach ($childboards as $cb) { 
            $gchild['id'] = $cb->ID;
            $gchild['name'] = $cb->Org;
            $gchild['data']['orgname'] = (strlen(trim($b->Last)) > 0) ? $b->First . ' ' . $b->Last : 'Unknown';
            $gchild['children'] = array();
            $childboardmembers = $cb->board();
            if ($childboardmembers) { foreach ($childboardmembers as $cbm) {
                $ggchild['id'] = $cbm->ID;
                $ggchild['name'] = (strlen(trim($cbm->Last)) > 0) ? $cbm->First . ' ' . $cbm->Last : 'Unknown';
                $ggchild['data']['orgname'] = $cb->Org;
                $ggchild['data']['relation'] = $cbm->Role;
                $ggchild['data']['occupation'] = $cbm->Occupation;
                $ggchild['children'] = array();
                $gchild['children'][]= $ggchild;
            }}
            $child['children'][]= $gchild;
        }}
        $top['children'][] = $child;
    }
} 
$top['data'] = array();
$top['data']['description'] = $center->Desc;
echo json_encode($top);
//在Re hakre回复中编辑2011.10.24 我的数据结构是一个具有唯一ID的组织表,一个具有唯一ID的人员表,然后是两个指定组织(实体)和人员以及人员在实体中扮演的角色的桥接表。典型的多对多模式。根本没有子板。我做了一个图像,现在看起来有点毫无意义,但我会把它添加到底部

JIT库数据结构(对我来说)有点疯狂,因为在他们的示例中是这样的:

Top: Nine Inch Nails
  Child: Jerome Dillon
    Child:  Howlin Maggie (another band)
      {all the bands' members and then all of their bands...}
因此,组织(乐队)被视为一个人,即使它由许多人组成。当我使用上面的代码递归时,我会得到(我认为)可怕的bloat,但是JSON尽管bloat仍然能正常工作

示例和 //结束编辑


您的问题很难回答,因为您的数据结构主要未知

对于图形表示,如果我理解正确,您只需要提供简单的关系:

*- Parent
   +- Child
   +- Child
   ...
   `- Child
您的数据结构有不同的格式,我不知道具体的格式,但它类似于:

Org <-- 1:n --> Board

Board <-- n:n --> Board # If you have sub-boards

Board <-- n:n --> Member

多对多数据模型所具有的功能是。JIT是为客户而设计的

换句话说,当一个人连接到多个组织时,JIT将无法正确显示数据中表示的交叉线

我推荐一个合适的网络图可视化——它对于现代浏览器来说是一个很好的实现

考虑到您的表结构,它使用的JSON数据格式实际上更容易实现-对于所有组织和人员,您可以定义对象:

{
    "name": "Mme.Hucheloup",
    "group": 1
},
{
    "name": "Afton School Board",
    "group": 2
}
对于关联表中的每个关联,您可以定义将它们连接在一起的连接对象:

{
    "source": 1,
    "target": 2
},

D3中奇特的编码处理了其余部分。祝你好运

您可以使用以下功能:

function get_orgs_and_childs ($child_id, $found = array()) 
{
    array_push ($found, $child['name']);

    if($child['children'])){
            $found[] = get_parents($child['id'], $found);
    }
    return $found;
}
使用以下命令调用它:

$orgs = get_orgs_and_childs($child['id']);

嗨,哈克雷,谢谢你的回复!我已经澄清了我的模式,并对JIT库JSON的模式进行了评论。请看一看,看它是否对你的答案有影响。谢谢实际上,JIT的超树做的正是我想要它做的,做的正是你说它不会做的。看看市长米奇·兰德里欧的节点:谢谢你的链接!虽然不是我的目标,但力定向图很有趣!为了好玩,我用我的整个数据集和力定向图做了一个演示。Links数组严格按照数字索引排列,因此有一个唯一的董事会成员节点,因为您必须制定一个方案,以了解您将Mayor Landrieu加入了哪个索引。因此,每个电路板都绘制为一个单独的图形。还是挺好玩的!这是另一个添加索引数组的方法,该数组与我的对象ID相关联,并将它们的数字索引存储在节点[]中。有一些奇怪的工件,其中连接到多个板的板成员有一个自由浮动的重复节点。总之很有趣,但不是我想要的。增加了踢的放大;在节点上向下滚动以查看整个地图。啊。。。看到您的真实数据集,我会修改我听起来果断的说法,即这是一个图表。它几乎不是一个图形,大部分是一棵树。我只看到了一些多对多存在的实例,你是对的,JIT可以处理这些。我在想,你看到的更多的是一个社交网络,比如说[linkedIn地图]((很多是对等网络),那种东西会
$orgs = get_orgs_and_childs($child['id']);