2011-10-20 178 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']);