2016-09-03 7 views
0

Ich möchte ein multidimensionales Array für d3.sankey erstellen.Sankey Diagramm, multidimensionales Array erstellen mit Abfrage in PHP

Aber ich verstehe es nicht, wie es funktioniert, ein multidimensionales Array zu erstellen.

Was ich brauche, ist:

d3.Sankey braucht eine Eingabe wie:

{ 
"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} 
]} 

Acctually bauen i das Ding mit Streichern. Das klingt wirklich kompliziert und ist es auch. Ein Fehler und es funktioniert nicht mehr.

Also meine Frage ist, wie kann ich diese Form mit Arrays erstellen.

Also zuerst rufe ich die Datenbank an, um mir alle Einträge zu geben, die von und Inputtable kommen. wie folgt aussieht: (ja, im von Deutschland so ein paar Worte in dieser Abfrage sind Deutsch Worte;))

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

Die „Input“ Abfrage, um die Einträge für die Knoten erhalten und verbindet weicht einen Knoten Weichen steht beziehen soll in der Mitte des sankey-Diagramm (zum besseren Verständnis habe ich ein Bild)

Nächsten Schritt 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); 

all diese Einträge alle Einträge aus einer ausgebbaren muß aus, dass verweisen Node in the Middle also sein selbst (hoffe du verstehst, was ich meine)

Was ich tun atm ist, bekomme ich die Eingabe und Ausgabe Abfragen und setzen sie zusammen, indem Sie eine sehr lange Zeichenfolge.

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

Lassen Sie mich erklären, was im tut:

Erster Schritt gesetzt i einen Zähler. Als nächstes zähle ich alle Einträge in Query, um den Knoten in der Mitte zu setzen. Zum Beispiel habe ich 5 Einträge, so dass ich den Knoten in der Mitte bis 6. Nextstep einstellen müssen, ist

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

nächsten Schritt i die foreach-Schleife laufen initialisieren alle Einträge in Zeichenfolge füllen i erhalten müssen etwas wie das

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

mein Code dafür ist

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

der Zähler zählt eine ID für jede entrie

und auch ich muss Links setzen. So beziehen sich die Knoten an den Knoten in der Mitte

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

So Quelle die gleiche ID wie in Knoten, Ziel ist der Knoten in der Mitte Menge und Einheiten sind selbsterklärend.

Kurz gesagt ich das gleiche tun die Ausgabe nur zu bekommen, dass die Quelle der Knoten in der Mitte und das Ziel jeder Knoten es selfs

Eigentlich funktioniert es, aber ich denke, es gibt viel mehr bessere Lösung mit Arrays.

So jetzt brauche ich Hilfe, um ein Array zu erstellen, die ich als Variable für Javascript speichern kann.

Wenn jemand weiß, wie das funktioniert und mir sagen. Das wäre großartig!

Antwort

1

Die bessere Lösung mit Arrays ist ein Array mit der Struktur, die Sie bauen wollen und führen Sie es durch 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

wow, danke. Sieht ganz ähnlich aus wie meine Saite. Aber es funktioniert nicht. Ich weiß nicht warum. Errormeassage ist "Kann Eigenschaft für" von nicht definiertem "nicht lesen". Wenn ich zu meiner String-Version zurückwechsle, funktioniert alles wie erwartet. Ich habe bereits beide Variablen verglichen und es ist genau das gleiche – Sires

+0

Okay, ich überprüfe alles Twich in der Konsole und etwas schief geht mit den Daten ...... auf meiner alten Version habe ich Knoten = 23 und Links = 21 und in der Neue Version sind nur Knoten = 22 und Links = 22. Ich werde eine Wiederholung geben, wenn ich das Problem in meinem Code behoben habe;) – Sires

+1

Jetzt funktioniert es. Vielen dank für Deine Hilfe. Beste Sache auf Ihrer Methode ist es wirklich klar, und ich könnte einige Fehler töten, die ich nie vorher bemerkt habe: D – Sires