GD::Graph - Array Problem

Hallo,

ich benötige mal einen Denkanstoss. Ich lasse mir ein SQL-Statement in mein Modul übergeben und lese das Ergebnis Zeile für Zeile aus. Das Ergebnis des Statements sieht zum Beispiel so aus:

--------------------------------------------------------------
|ID |ORT |Gebäude | Kosten
--------------------------------------------------------------
|0 |München |Hauptgeb | 1000
|1 |München |Nebengeb1 | 900
|2 |München |Nebengeb2 | 750 
|3 |München |Nebengeb3 | 300
|4 |München |Nebengeb4 | 1450
|5 |Berlin |Hauptgeb | 4500
|6 |Berlin |Nebengeb1 | 2750
|7 |Berlin |Nebengeb2 | 400
|8 |Berlin |Nebengeb3 | 900
|9 |Berlin |Nebengeg4 | 300
|10 |Stuttgart |Hauptgeb | 1478

Um das ganze als Balkendiagramm darstellen zu können benutze ich GD::Graph::bars;

Die Daten werden dabei folgendermaßen angegeben:

@data = (
['Hauptgebäude','Nebengeb1','Nebengeb2','nebengeb3','Nebengeb4'],
 [1000, 900, 750, 300, 1450],
 [4500, 2750, 400, 900, 300]
);

Ich speichere natürlich die Daten vorher in Array’s, so dass mein Aufruf folgendermaßen aussieht:

@data = (
$referenz\_auf\_gebäude,
$referenz\_auf\_daten\_münchen,
$referenz\_auf\_daten\_berlin
);

Wenn ich das Ganze so ausgeben lasse, dann funktioniert es auch. Mein Problem ist jetzt allerdings folgendes:
Da ich nicht immer sicher weiß, wie viele Orte kommen (sprich, ob noch referenzen auf Stuttgart, Bremen, Hamburg folgen), kann ich nicht hart in den Quellcode schreiben ‚es folgen zwei Referenzen‘, sondern muss das variabel gestalten. Dazu muss ich auch die Arraynamen zur Laufzeit erstellen und variabel halten. Und genau hier liegt das Problem: Gibt es eine Möglichkeit Variablennamen variabel zur Laufzeit zu erstellen?

Ich hoffe das Problem wurde verstanden, ansonsten bitte kurze Rückmeldung!

Vielen Dank schon mal für alle hilfreichen Tipps!

[MOD] pre-Tags hinzugefügt

Hallo,

Wenn ich das Ganze so ausgeben lasse, dann funktioniert es
auch. Mein Problem ist jetzt allerdings folgendes:
Da ich nicht immer sicher weiß, wie viele Orte kommen (sprich,
ob noch referenzen auf Stuttgart, Bremen, Hamburg folgen),
kann ich nicht hart in den Quellcode schreiben „es folgen zwei
Referenzen“, sondern muss das variabel gestalten. Dazu muss
ich auch die Arraynamen zur Laufzeit erstellen und variabel
halten.

Immer wenn du variable Variablennamen willst, nimm stattdessen ein Hash.

Du kannst den Städtenamen als Key nehmen, und als Value die array ref, auf die die aktuelle Zeile draufschieben kannst.

Grüße,
Moritz

P.S. benutze bitte in Zukunft

-Tags um den Code, dann sieht der auch viel ordentlicher aus.

Das Problem ist das Gleiche, auch wenn ich Hashes nutze. Denn ich weiss ja trotzdem nicht wie viele Arrays ich brauche. Ich kann zwar in dem Hash die Array-Refs speichern, allerdings weiss ich von vornherein ja nicht wie viele Arrays ich brauche. Es kann sein, dass in einem Statement 3 Städte vorkommen, im nächsten Statement allerdings 7.

In Fall a) würde das bedeuten, dass Wert Nr.1 in Array1 gespeichert wird, Wert Nr.2 in Array2, Wert Nr.3 in Array3, Wert Nr.4 in Array1, Wert Nr.5 in Array2 usw.

Bei 7 Städten bräuchte ich dementsprechen 7 Array’s wobei dann Wert Nr.1 + Wert Nr.8 + Wert Nr.15 in Array1 kommen. Da bis zum letzten Durchlauf immer weiter Daten an die vorhandenen Array’s rangepusht werden kann ich das vorhandene Array nicht neu initialisieren, sondern brauche tatsächliche diese Anzahl an Array’s. Dementsprechend muss ich die Array’s variabel erstellen. Ob ich die Array-Ref’s nachher in einem Hash speichere oder nicht ist dabei nicht wichtig.

Befinde ich mich gerade total auf dem Holzweg oder fehlt mir nur der Durchblick?

PS. Werde in Zukunft

-Tags nutzen.


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Hallo,

Das Problem ist das Gleiche, auch wenn ich Hashes nutze. Denn
ich weiss ja trotzdem nicht wie viele Arrays ich brauche.

Aber weil deine Arrays im Hash liegen, und ein Hash keine feste Größe hat, ist das kein Problem.

Ich
kann zwar in dem Hash die Array-Refs speichern, allerdings
weiss ich von vornherein ja nicht wie viele Arrays ich
brauche.

Du musst es ja auch nicht vorher wissen.

my %hash;
push @{$hash{foo}}, $item;

schiebt $item auf die Liste in $hash{foo}, selbst wenn es vorher unter foo keinen Eintrag gab.

Grüße,
Moritz