2011-10-20 79 views
4

我拥有一组组织及其董事会成员。 所有组织都有董事会成员,许多董事会成员都在多个组织的董事会中。通过相关实体正确递归

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

我很想重新定位事件查询并根据更改重新填充图形。然后2级会很好,但我还没有能够解决如何做到这一点。

我目前使用的代码是从起始组织手动递归三个级别,但我想要的是重新诅咒所有相关记录。

所以它将从一个组织开始,并添加组织的孩子们(董事会成员)。然后为每个董事会成员提取所有董事会(当前组织除外),并将其添加为董事会成员的子女。

这样会持续下去,直到每条线索都死了 - 大概是只属于一个董事会的董事会成员。

任何人都有如何创建此数组,并避免重复的建议?

$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); 

//编辑2011.10.24在Re hakre响应 我的数据结构组织的独特ID的表,通过唯一的ID人民一个表,然后两个组织指定一个桥接表(实体)和Person以及Person在实体中扮演的角色。一个典型的多对多。根本没有子板。我做了一个现在看来毫无意义的图像,但我会在底部添加它。

的JIT库数据结构是在一个小坚果(对我来说)它是这样在他们的乐队例如:

Top: Nine Inch Nails 
    Child: Jerome Dillon 
    Child: Howlin Maggie (another band) 
     {all the bands' members and then all of their bands...} 

所以组织(带)进行处理,就好像它是一个人连尽管它由许多人组成。当我使用上面的代码递归时,我得到(我认为)可怕的膨胀,但它使JSON工作正常,尽管膨胀。

JSONExample Visualization //结束编辑

schema

回答

2

你提的问题是很难在这个意义上,你的数据结构主要是未知的回答。

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

*- Parent 
    +- Child 
    +- Child 
    ... 
    `- Child 

你的数据结构有不同的格式,具体我不知道,但它是这样的:

Org <-- 1:n --> Board 

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

Board <-- n:n --> Member 

无论您的数据如何表示,要将数据映射或转换为图形表示所需的结构,您需要一些处理该数据的功能。

为此,您需要在两者和特定键之间共享分类/类型,以便您可以查找事件中所需的数据以返回数据。例如:

if (request_parent_is_org()) 
{ 
    $id = request_parent_id(); 
    $parent = data_get_board($id); 
    $parent->addChildrent(data_get_board_children($id)); 
} 
else 
{ 
    ... # All the other decisions you need to take based on request type 
} 

view_response_to_json($parent); 
+0

嗨hakre,感谢您的答复!我已经阐明了我的模式并对JIT库JSON的模式进行了评论。请看看它是否影响你的答案。谢谢! – jerrygarciuh

2

您对多对多数据模型有什么建议是graph。 JIT专为trees设计。

换句话说,只要一个人连接到多个组织,JIT就不会正确显示数据中表示的交叉线。

我建议一个适当的网络图形可视化 - D3.js有很好的现代浏览器实现。

它使用JSON数据格式实际上是更容易实现给你的表结构 - 所有的组织和个人,可以定义对象:

{ 
    "name": "Mme.Hucheloup", 
    "group": 1 
}, 
{ 
    "name": "Afton School Board", 
    "group": 2 
} 

并为您的关联表你定义的连接对象的每个协会将它们连接在一起:

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

D3中的花式编码负责其余部分。祝你好运!

+0

其实JIT的hypertree确实做了我想做的事情,做你说的不会做的事情。查看市长Mitch Landrieu的节点:http://nolasatellitegovernment.tulane.edu/network_mapping.php?oID=10感谢您的链接!虽然不是我想要的力量指示图很有趣! – jerrygarciuh

+0

只是为了踢我使用我的整个数据集和力导向图演示。 Links数组严格按数字索引排列,因此必须有一个独特的董事会成员节点,因为您必须制定方案来了解您将市长Landrieu锁定的索引。所以每块电路板都绘制成独立的图形。还是有趣的! http://nolasatellitegovernment.tulane.edu/vis/d3/force/ – jerrygarciuh

+0

下面是另外一个带有添加索引的数组,它们被键入我的对象的ID并将它们的数字索引存储在节点[]中。有一些奇怪的文物,连接到多个董事会的董事会成员有一个自由浮动复制节点。一切都很有趣,但不是我所追求的。增加了放大功能;向下滚动节点以查看整个地图。 http://nolasatellitegovernment.tulane.edu/vis/d3/force/linked.html – jerrygarciuh

2

您可以使用以下功能:

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']);