2011-10-20 8 views
4

私は、組織とその役員のセットを持っています。 すべての組織には取締役がおり、多くの取締役は複数の組織の取締役を務めています。関連するエンティティを介して適切に再帰する

私はJIT Hypertreeを使用してその関係を説明しています。 JIT Hypertreeスキーマでは、1つのアイテムがすべての親であり、単一のJSON配列に基づいて描画されている必要があります。

私は再センタリングイベントのクエリを持って、変更に基づいてグラフを再配置したいと思っています。それから、2つのレベルはうまくいくでしょうが、私はそれをどうやって行うかを考え出すことができませんでした。

私が現在持っているコードは、開始組織から3段階で手動で再帰しますが、必要なのは関連するすべてのレコードを再呪うことです。

だから、Orgから始まり、Orgの子ども(役員)の配列を追加します。次に、各ボードメンバーのすべてのボード(現在のOrg以外)を取り出し、それらをボードメンバーの子として追加します。

これは、各トレイルの死亡が終わるまで続きます。おそらく、1つのボードにのみ所属するボードメンバーになります。

この配列の作成方法と重複を避ける方法についてアドバイスをいただけますか?

$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を持つ人々のテーブル、そしてブリッジングテーブルを持つ組織の表である(エンティティ)と人物とその人物がエンティティで果たしている役割。典型的な多対多。サブボードは全くありません。私はそれをイメージしましたが、今は無意味ですが、私はそれを底に付け加えます。それは彼らのバンドの例ではこのように書き、その中で

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

あなたの質問は、あなたのデータ構造は、主に未知の感覚でお答えすることは困難です。

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

あなたのデータ構造が異なるフォーマットを持って、私は特に知らないが、それはのようなものです::

私が正しくことを理解していれば、あなただけの単純な関係を提供する必要がグラフィカルrepresenationについては

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は、1人のユーザーが複数の組織に接続されている場合、データに表される交差線を正しく表示しません。

適切なネットワークグラフの可視化をお勧めします。D3.jsは、最新のブラウザ向けに優れた実装を備えています。

JSONデータ・フォーマットが使用するには、実際にあなたのテーブル構造与えられた実装が簡単です - すべての組織や人々のために、あなたは、オブジェクトを定義します。

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

そして、あなたは、接続オブジェクトを定義し、あなたの関連テーブル内の各関連性について

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

D3のファンシーコーディングは残りの部分を処理します。がんばろう!

+0

実際、JITのハイパーツリーは、私がやりたいことを正確に行い、あなたが言うことはしません。 Mitch Landrieu市長の市長をチェックしてください:http://nolasatellitegovernment.tulane.edu/network_mapping.php?oID=10リンクありがとうございます!私が何を目指しているのかは分からないが、有向グラフは面白い! – jerrygarciuh

+0

ちょうどキックのために私はデータセット全体とForce Directed Graphを使ってデモを作った。 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']); 
関連する問題