2016-09-03 7 views
0

d3.sankeyの多次元配列を作成したい。Sankeyダイアグラム、多次元配列PHPのクエリで作成

しかし、私はそれが多次元配列を構築する方法を知りません。私は必要なもの

です:Acctually私は文字列でその事を構築

{ 
"nodes":[ 
{"node":0,"name":"node0"}, 
{"node":1,"name":"node1"}, 
{"node":2,"name":"node2"}, 
{"node":3,"name":"node3"}, 
{"node":4,"name":"node4"} 
], 
"links":[ 
{"source":0,"target":2,"value":2}, 
{"source":1,"target":2,"value":2}, 
{"source":1,"target":3,"value":2}, 
{"source":0,"target":4,"value":2}, 
{"source":2,"target":3,"value":2}, 
{"source":2,"target":4,"value":2}, 
{"source":3,"target":4,"value":4} 
]} 

d3.Sankeyのような入力を必要とします。それは本当に複雑な音で、それはそうです。 1つの間違いはもう働きません。

私の質問はどのように私は配列を使ってそのフォームをビルドできますか?

まず、私はデータベースを呼び出して、入力欄と入力欄のすべてのエントリを与えます。 は、次のようになります。(はい、ドイツからのイムので、クエリ内のいくつかの単語はドイツ語の単語である;))

$stmt = self::$_db->prepare("SELECT BalancesheetInput.RessourceName, " 
      . "SUM(BalancesheetInput.Amount) AS Amount, " 
      . "Einheiten.Einheit AS Unit " 
      . "FROM BalancesheetInput " 
      . "INNER JOIN Einheiten ON Unit_FK = Unit_ID " 
      . "GROUP BY BalancesheetInput.RessourceName"); 
     $stmt->execute(); 

     $fetcharray = $stmt->fetchALL(PDO::FETCH_ASSOC); 

「入力」の問合せは、ノードのエントリを取得し、ウィッヒは、1つのノードウィッヒスタンドを参照してくださいリンクします次にステップサンキー、図の中央に(より良い理解のためにIピクチャを添加)

私はすべてのこれらのエントリは、それから参照出力可能

$stmtOutput = self::$_db->prepare("SELECT BalancesheetOutput.RessourceName, " 
      ."SUM(BalancesheetOutput.Amount) AS AmountOutput, " 
      ."Einheiten.Einheit AS UnitOutput " 
      ."FROM BalancesheetOutput " 
      ."INNER JOIN Einheiten ON Unit_FK = Unit_ID " 
      ."GROUP BY BalancesheetOutput.RessourceName"); 
     $stmtOutput->execute(); 
     $fetcharrayOutput = $stmtOutput->fetchAll(PDO::FETCH_ASSOC); 

からすべてのエントリを必要とします中にノードがあるので、自分自身(自分が何を意味するかを理解してもらいたい)

atmで何をしているのかは、入力クエリと出力クエリを取得し、非常に長い文字列を作成することです。

$counter = 0; 
    $ziel = count($fetcharray); 
    $array_values = count($fetcharray); 

    $counterafterInput = 0; 

    $jsonNodes ='{"nodes":['; 
    $jsonLinkes = '],"links":['; 
    foreach ($fetcharray as $getnodes){ 

     if (($array_values-1) == $counter) { 
      // saves node to string, 
      //// wenn letzer Datenbankeintrag erreicht ist addet Schöneweide als Node 
      $jsonNodes .= '{"node":'. $counter. ',"name":"' . $getnodes['RessourceName'] . '","units":"'.$getnodes['Unit'].'"},'; 
      $jsonNodes .= '{"node":'. ($counter+1). ',"name":"Schöneweide","units":"Blackbox"},'; 
      // $jsonNodes .= '{"node":'. ($counter+2). ',"name":"weiter","units":"'.$getnodes['Unit'].'"},'; //irgendwann obsolete 

      // saves node to string, wenn letzer Datenbankeintrag erreicht ist 
      $jsonLinkes .= '{"source":'.$counter .',"target":' .$ziel . ',"value":' . $getnodes['Amount'] . ',"units":"'.$getnodes['Unit'].'"},'; 
      // $jsonLinkes .= '{"source":'.($counter+1) .',"target":' .($ziel+1) . ',"value":' . $getnodes['Amount'] . ',"units":"'.$getnodes['Unit'].'"}'; 

      $counter++; 
      $counterafterInput = $counter; 
      $counter++; 

     } 
     else{ 
     //saves nodes to string while counter != Anzahl der Datenbankeinträge 
     //If else weil durch Komma getrennte Schreibeweise die nodes und Links eingetragen werden .... geht in die if ,wenn der vorletzte eintrag erreicht wird um 
     //die letze Node anzuhängen. Die letzte Node ist die Blackbox Schöneweide(oder später auch ein anderes Gebiet 

      $jsonNodes .= '{"node":'. $counter. ',"name":"' . $getnodes['RessourceName'] . '","units":"'.$getnodes['Unit'].'"},'; 
      $jsonLinkes .= '{"source":'.$counter .',"target":' .$ziel . ',"value":' . $getnodes['Amount'] . ',"units":"'.$getnodes['Unit'].'"},'; 


     $counter++; 
    } 
    } 

    $counterOutput = 0; 

    $array_values_output = count($fetcharrayOutput); 
    $jsnonnodesOutput = ""; 
    $jsonLinkesOutput = ""; 


    foreach ($fetcharrayOutput as $getnodesOutput) 
    { 
     if (($array_values_output-1) == $counterOutput){ 

     $jsnonnodesOutput .= '{"node":'.$counter.',"name":"'.$getnodesOutput['RessourceName'].'","units":"'.$getnodesOutput['UnitOutput'].'"}'; 
     $jsonLinkesOutput .= '{"source":'.$counterafterInput.',"target":'.$counter.',"value":'.$getnodesOutput['AmountOutput'].',"units":"'.$getnodesOutput['UnitOutput'].'"}]}'; 
     } 
     else 
     { 
      $jsnonnodesOutput .= '{"node":'.$counter.',"name":"'.$getnodesOutput['RessourceName'].'","units":"'.$getnodesOutput['UnitOutput'].'"},'; 
      $jsonLinkesOutput .= '{"source":'.$counterafterInput.',"target":'.$counter.',"value":'.$getnodesOutput['AmountOutput'].',"units":"'.$getnodesOutput['UnitOutput'].'"},'; 
      $counterOutput++; 
      $counter++; 
     } 


    } 

    $JSONstring = $jsonNodes. $jsnonnodesOutput . $jsonLinkes .$jsonLinkesOutput; 


    return $JSONstring; 

だから、私がやって何イム説明しましょう:

最初のステップは、私はカウンターを設定します。 次に、クエリのすべてのエントリをカウントして、ノードを中央に設定します。私は私が取得する必要があり、文字列内のすべてのエントリを埋めるためのforeachループを実行

`$jsonNodes ='{"nodes":[';` 

次のステップを初期化している6 NEXTSTEPに途中でノードを設定する必要があるので、例えば iは5つのエントリを得ましたその

{"node":0,"name":"node0"}, 

のようなものそのための私のコードは

$jsonNodes .= '{"node":'. $counter. ',"name":"' . $getnodes['RessourceName'] . '","units":"'.$getnodes['Unit'].'"},'; 

カウンターは各entrie

0のIDをカウントしています

またリンクを設定する必要があります。そうノードは放射源SOは、ノードのように同じIDである中間

$jsonLinkes .= '{"source":'.$counter .',"target":' .$ziel . ',"value":' . $getnodes['Amount'] . ',"units":"'.$getnodes['Unit'].'"},'; 

内のノードを参照し、ターゲットは、中間量のノードであり、単位は自明です。

私は同じソースが真ん中にノードであり、ターゲットは、各ノードで、それは自殖

実際にそれが動作しますが、私はより多くの、より良い解決策があると思うだけという出力を得るために行う要するに

アレイ。

だから私はJavaScriptを変数として保存することができる配列を作成するためのヘルプが必要です。

誰かがそれがどのように動作しているかを知っていれば教えてください。それは素晴らしいだろう!

答えて

1

配列とのより良い解決策は、あなたが望む構造を持つ配列を作成し、その後json_encode()を通してそれを実行することです:

$nodes = array(); 
$nodes[] = array('node' => 0, 'name' => 'node0'); 
$nodes[] = array('node' => 1, 'name' => 'node1'); 
$nodes[] = array('node' => 2, 'name' => 'node2'); 

$links = array(); 
$links[] = array('source' => 0, 'target' => 2, 'value' => 2); 
$links[] = array('source' => 0, 'target' => 1, 'value' => 2); 

echo json_encode(array('nodes' => $nodes, 'links' => $links)); 
// {"nodes":[{"node":0,"name":"node0"},{"node":1,"name":"node1"},{"node":2,"name":"node2"}],"links":[{"source":0,"target":2,"value":2},{"source":0,"target":1,"value":2}]} 
+0

すごいが、ありがとうございます。私の弦のように全く同じように見えます。しかし、それは動作しません。理由は分かりません。 Errormeassageは "forEach 'for undefined"プロパティを読み取ることができません "。私が私のString-versionに戻ったとき、すべては期待どおりに機能します。私はすでに両方の変数を比較しており、それはまったく同じです – Sires

+0

私はコンソールで何かtwichをチェックし、何かデータに間違っています......私の古いバージョンでは、ノード= 23とリンク= 21を得て、新しいバージョンはちょうどノード= 22とリンク= 22です。私のコードで問題を修正したときにリプレイを行います;) – Sires

+1

これは動作しています。助けてくれてありがとう。あなたの方法で最も良いことは、それは本当に明確であり、私は以前に気づかなかったいくつかのエラーを殺すことができます:D – Sires