Array in einer Schleife dynamisch zusammenstellen

Kamikurt

Grünschnabel
Hallo,

wie so oft gibt es eine While-Schleife, die Inhalte aus einer DB in ein ARRAY liest. Der klassische Fall:

PHP:
while ($zeile=mysql_fetch_array($ergebnis))
{
    $test_array[]=array($monat,$jahr, $zeile['wert1'],$zeile['wert2'],$zeile['wert3']);
}

Da sich aber die Anzahl der Werte ändern kann, möchte ich etwas Eleganteres finden, als immer den Code anzupassen. Der Gedanke war, die zugelassenen Werte als Index (also wert1, wert2, usw.) in einer DB Tabelle zu speichern. Liest man diese Tabelle aus, hat man alle Indices, die in der Schleife vorkommen.

Woran scheiterts?

Ich finde keine Möglichkeit, das ARRAY dynamisch zu definieren, mir fehlt da anscheinend Syntax. Der Zusammenbau kann ja z.B. so aussehen (Indexliste ist ein array, das aus der DB ausgelesen wurde und alle verwendeten Indices enthält)

PHP:
$arraystring = '$monat,$jahr,';
foreach($indexliste AS $schluessel => $index)
{
  $arraystring.= '$zeile[\''.$index.'\],';
}

Dann kommt so etwas raus wie "$monat,$jahr, $zeile['wert1'],$zeile['wert2'],$zeile['wertn']".

Aber die Zuweisung $test_array[]=array($arraystring); ist nicht zulässig, zumindest verzweifle ich grad dran.

Hat jemand einen Tipp, wie ich aus einer DB Tabelle ausgelesene Indizes nutzen kann, um mir ein array anzulegen?

Liebe Grüße
Kami
 
Äh, DB- Tabellen wachsen nicht vertikal, das ist GANZ SCHLECHT. Übderdenke das Datenbankdesign bevor du weitermachst.
 
Hallo,

danke für den Hinweis. Ich bin mir nicht ganz sicher, ob ich ihn verstehe, daher mein Anliegen nochmal in anderen Worten:

Ich habe eine DB Tabelle, die statistische Werte verarbeitet. In ihr sind eine Zahl von n-Spalten enthalten, die die entsprechenden Werte speichern. Ich kann mit einfachen SQL-Statements die Daten in der Statistik Tabelle updaten oder einfügen.

Jetzt kommt es vor, daß die Tabelle erweitert wird um zusätzliche Spalten. So kann z.B. eine neuer Statistikwert hinzukommen oder es wird entschieden, daß ein Wert entfällt. Bisher muss daher neben der Tabelle auch immer der Code angebpaßt werden, der diese Tabelle bearbeitet, da ja die SQL-Statements und Arrays diese Spalten kennen müssen. Kommen Spalten hinzu oder fallen weg, muss der Code angepasst werden.

Der Gedanke war, die Spalten entweder über eine eigene Tabelle zu ermitteln, die alle momentan verwendeten Statistikwerte nebst Tabellenspalten beinhaltet oder über SHOW COLUMNS die aktuellen Spalten zu ermitteln und aus dieser Information die für die Befüllung des Statistikfeldes nötigen Indices zu ermitteln. Damit kann dann das Array definiert werden.

Ziel soll sein, daß ich mit Hilfe einer Schleife das entsprechende Array dynamisch für das Speichern der Statistikwerte im Script generieren kann.

Gibt es also z.B. nur Wert1, Wert2 und Wert3 dann ist die Array-Erzeugung

$array = array(Wert1, Wert2, Wert3);

Da ich aber vorher nicht weiß, wieviele Werte (Spalten) es sind, kann ich das Array nicht statisch definieren. Ich habe die entsprechenden Bezeichner der Spalten, aber wie wird daraus eine Zeile, die das ARRAY erzeugt, in dem die Inhalte der Tabellenspalten Wert1, Wert2 und Wert3 abgelegt werden?

Ich weiß natürlich, wie man ein Array definiert, aber wie kann ich es dynamisch aus den Werten der aktuellen Spalten der Tabelle zusammenbauen und befüllen ohne vorher zu wissen, wie viele Spalten meine Tabelle hat und ohne immer die Codezeile anpassen zu müssen?

Bin mir nicht sicher, wie ich Deine Antwort darauf anwenden soll....bin Dir dankbar, daß Du Dir Zeit genommen hast und ggf. ist meine Ausführung nicht klar.

EIgentlich will ich nur wissen, wie man ein ARRAY mit einem beliebig vorher montierten String definiert, also

$string = 'Wert1, Wert2, Wert3);

später....

$array[] = array($string);

Kami
 
Zuletzt bearbeitet:
Ja, dein Datenbankdesign ist ******e, um meine Ausführung noch klarer zu machen ;)
Die Anzahl der Spalten ist nämlich nicht variabel ;)
 
OK,

dann brauche ich einen Tipp wie ich bei einem Prototyp, der Daten aus einem anderen System bezieht / importiert, bei dem sich die verwendeten Werte verändern können das Thema angehe.

Mein Script generiert Werte auf Basis der Kategorien des Fremdsystems. Verändern sich diese Kategorien, verändern sich entsprechend bei mir die Anzahl der Werte. Ich muss also wissen, welche Werte gerade aktuell sind (die bekomme ich per Input) und zu denen meine Statistikwerte erzeugen und dauerhaft ablegen, so daß ein angeschlossenes Reporting diese Werte auslesen kann. Wie würdest Du das anfangen zu lösen, wenn die Anzahl dieser Werte variabel ist?

Grüße von
Kami
 
Gib mal einige Beispieldaten...

Aber du brauchst auf jeden Fall schonmal noch ne zweite Tabelle in der die Werte stehen.
 
Hi alxy,

das sind die Daten, die aus dem System kommen:

Tickets:
Kategorie, Datum, Severity usw.

Diese kommen in die Ticket-Tabelle

Dann läuft das Script rüber und ermittelt die Laufzeiten, SLA Brüche, Häufigkeiten usw. Daraus entstehen statistische Daten, also z.B.

* Häufgkeit pro Typ
* Anzahl geöffneter Tickets pro Monat
* Anzahl von Servicedaten
* Häufigkeiten von Priorisierungen
usw.

So gibt es dann z.B. für die Kategorie die Werte (Hosting, IP, Security, Transmission, VDC usw.). Für diese Kategorien sollen die errechneten Werte pro Jahr/Monat/Kunde gespeichert werden. Der jetzige Ansatz erfolgt in einer Statistik-Tabelle (zusätzlich zur Tickettabelle), die z.B. die Spalten

Monat
Jahr
Kunde
VDC (Anzahl Tickets in dieser Kategorie)
IP (Anzahl Tickets in dieser Kategorie)
Transmission (Anzahl Tickets in dieser Kategorie)
Hosting (Anzahl Tickets in dieser Kategorie)

usw. enthält. Ein typischer Datensatz sieht in etwa so aus:

5, 2013, 4, 2,6,2,160 .....

Wenn nun das führende System eine neue Kategorie also z.B. Security einführt, fehlt

a) in der Tabelle Statistik eine entsprechende Spalte Security
b) in allen Codeteilen in der Verarbeitung von Daten, da hier Arrays genutzt werden, deren Feldelemente denen der Tabellen entsprechen. Kommen also Spalten hinzu oder fallen weg, muss der Code angepasst werden.

Nun kann ich also

a) entweder eine weitere Tabelle einführen, in der ich die momentan aktiven Spalten der Statistik pflege (ich muss natrülich trotzdem die Tabelle Statistik anpassen)
b) einfach die Spaltenüberschriften der Statistik Tabelle ermitteln und verwenden.

PHP:
# DB Zugriff 1:
# ermittle aktuelle Spaltenüberschriften der Tabelle Statistik
# Lese diese in ein Feld SPALTEN ein

# DB Zugriff 2:
# Lese * Datensätze aus der Tabelle Statistik
# Schreibe die Daten aus der Tabelle Statistik in ein ARRAY STAT
## $STAT[]=array(Spalte1, Spalte2,Spalte3,Spalte4);

Die letzte Pseudo-Code Zeile ist also mein Problem. Wie fülle ich das ARRAY STAT wenn sich die Tabellenspalten in der Tabelle Statistik ändern?

Danke für einen Gedankenstubser.....

Grüße von
Kami
 
Ist zwar nicht schön. Aber übernimm doch einfach das Array direkt. Dann hast du alle Felder drin

PHP:
while ($zeile=mysql_fetch_array($ergebnis)){
    $test_array[]=array($monat,$jahr) + $zeile;
}
 
Wie wärs mit einer Tabelle 'kategorien', augebaut etwa so:

id | name | (hinzugefuegt; optional)

Tabelle 'tickets':

id | kategorie_id | datum | severity | (...)

Tabelle 'statistik':

Monat
Jahr
Kunde
VDC (Anzahl Tickets in dieser Kategorie)
IP (Anzahl Tickets in dieser Kategorie)
Transmission (Anzahl Tickets in dieser Kategorie)
Hosting (Anzahl Tickets in dieser Kategorie)
Hast du etwa für jede Kategorie ne eigene Statistiktabelle? Falls ja, sehr sehr schlecht.
Allerdings hört sich das eher nach ner Resulttable an, die sich ständig ändert. Jedenfalls kannst du in dieser auch eifnach auf die IDs aus 'kategorien' und 'tickets' zugreifen und musst keine Spalten für irgendwas hinzufügen.
 
Hallo Yaslaw,

Unglaublich!
Jetzt bastele ich schon seit langer Zeit als Hobby-PHPler rum - aber das ist irre.
Danke, damit habe ich was Neues für mich entdeckt, das mir viel Probleme erspart.
Danke für den Tipp, bin immer noch ganz baff, wie simpel manchmal Dinge sind wenn man sich auskennt :)
Habs getestet - geht einwandfrei!
Danke für eine ruhige Nacht, die ich nun haben werde :)
Kami
 
Zurück