Newbefrage zu Array komme nicht weiter
Peder
- php
Hallo,
habe mal eine Frage zur Array-Funktion.
Folgendes Grundproblem.
Möchte mir eine Timeline als Tabelle mit Personendaten (geboren / gestorben) erstellen. Die Daten kommen aus einer MySql Datenbank – abgefragt via php.
Suche mir zuerst das erste Geburtsjahr und das letzte Sterbejahr heraus(bzw. setzte einen Anfangs und Endpunkt – aber das ist erst später interessant). Weiß also jetzt wieviele Tabellenzellen es geben wird. Dann schreibe ich eine erste Zeile mit den jeweiligen Jahresangaben.
Nun kann ich natürlich für jeden DB-Eintrag eine Tabellenzeile schreiben und den Zeitraum darin eintragen, das führt aber zu einer langen unübersichtlichen Tabelle mit viel verschwendeten Platz.
Lieber würde ich es so machen, dass wenn mehrere Einträge in eine Zeile passen würden (also z.B. Person_1 1829 – 1877; Person_5 1878 – 1920; Person_17 1925 – 1980; etc.) diese auch in eine Zeile geschrieben würden. Das stellt mich allerdings vor das Problem, dass ich nicht weiß wieviele Tabelrows benötigt werden.
Muß also für jeden Eintrag abfragen ob es schon eine Tabelrow gibt in die der Eintrag passen würde oder ob eine neue Tabelrow angelegt werden muß. - Tja und dies ist momentan für mich ein nicht machbares Unternehmen und ich würde mich sehr freuen, wenn mir hier einer bei der Lösung dieses Problems behilflich sein kann.
Select min(year(birth)) as start from tabelle
habe also mein Start Jahr
End Jahr lege ich erstmal fest als z.B. 2000
Anzahl der <td> ist End Jahr-Start Jahr +1
Select name, year(birth)as b_year, year(death) as d_year, id from tabelle order by birth
und nun weiß ich nicht wie ich den PHP Code schreiben muß, damit abgefragt wird
IF 1. Eintrag
starte eine neue <tr>
ELSEIF
suche die <tr> nacheinander durch, bis erste <tr> gefunden wurde, in der Eintrag Platz hat.
ELSE
wenn keine gefunden lege neue <tr> an
und dann am Schluß müßten ja alle angelegten <tr> nochmals durchsucht werden um zu sehen, in welcher noch Zellen fehlen (und wie groß die jeweiligen fehlenden Zellen sein müssen), damit die jeweilige <tr> beendet werden kann.
Dann müßte jede einzelne so erstellte <tr> ausgegeben werden.
Ich denke mal das ist irgendetwas mit $tablerow[] aber da komme ich nicht weiter
Hoffe ich habe mich einigermaßen verständlich ausgedrückt und ihr könnt mir weiterhelfen.
Danke und Grüße,
Peter
Hi,
habe mal eine Frage zur Array-Funktion.
Zu welcher?
Oder meinst du zum *Datentyp* Array?
Lieber würde ich es so machen, dass wenn mehrere Einträge in eine Zeile passen würden (also z.B. Person_1 1829 – 1877; Person_5 1878 – 1920; Person_17 1925 – 1980; etc.) diese auch in eine Zeile geschrieben würden.
Dann definiere erst mal klar den Begriff „passen“ in diesem Zusammenhang.
Warum „passen“ die in eine Zeile? Was stellt eine Zeile also dar?
Muß also für jeden Eintrag abfragen ob es schon eine Tabelrow gibt in die der Eintrag passen würde oder ob eine neue Tabelrow angelegt werden muß.
Woweit ich dich verstanden habe, willst du einfach nur einen simplen, einstufigen Gruppenwechsel (Stichwort!) implementieren.
MfG ChrisB
Korrektur:
Woweit ich dich verstanden habe
Soweit, nicht Wowereit.
MfG ChrisB
Hallo ChrisB,
Woweit ich dich verstanden habe, willst du einfach nur einen simplen, einstufigen Gruppenwechsel (Stichwort!) implementieren.
Na dann werde ich mal Google bemühen und hoffe weiter zu kommen, auf alle Fälle schon mal danke für den Tipp
Grüße,
Peter
Hi Peder!
habe mal eine Frage zur Array-Funktion.
Welche Array-Funktion?
Möchte mir eine Timeline als Tabelle mit Personendaten (geboren / gestorben) erstellen. Die Daten kommen aus einer MySql Datenbank – abgefragt via php.
Soweit klar.
Suche mir zuerst das erste Geburtsjahr und das letzte Sterbejahr heraus(bzw. setzte einen Anfangs und Endpunkt – aber das ist erst später interessant). Weiß also jetzt wieviele Tabellenzellen es geben wird. Dann schreibe ich eine erste Zeile mit den jeweiligen Jahresangaben.
Das verstehe ich nicht. Warum weißt Du aufgrund des ersten Geburts- und des letzten Sterbejahres, wieviele Einträge in der Tabelle stehen?
Nun kann ich natürlich für jeden DB-Eintrag eine Tabellenzeile schreiben und den Zeitraum darin eintragen, das führt aber zu einer langen unübersichtlichen Tabelle mit viel verschwendeten Platz.
Lieber würde ich es so machen, dass wenn mehrere Einträge in eine Zeile passen würden (also z.B. Person_1 1829 – 1877; Person_5 1878 – 1920; Person_17 1925 – 1980; etc.) diese auch in eine Zeile geschrieben würden.
Sollte kein Problem darstellen.
Das stellt mich allerdings vor das Problem, dass ich nicht weiß wieviele Tabelrows benötigt werden.
Verstehe ich nicht. [Anzahl der Einträge] / [Anzahl der Datensätze pro Zeile] und das ganze aufrunden.
Muß also für jeden Eintrag abfragen ob es schon eine Tabelrow gibt in die der Eintrag passen würde oder ob eine neue Tabelrow angelegt werden muß.
Äh... was?
- Tja und dies ist momentan für mich ein nicht machbares Unternehmen und ich würde mich sehr freuen, wenn mir hier einer bei der Lösung dieses Problems behilflich sein kann.
Bitte beschreibe Dein Problem deutlicher. Also: was sind die Ausgangsdaten, wie möchtest Du sie darstellen, wonach sortiert, wie viele Datensätze pro Zeile.
mfG
Benjamin
Hi Benjamin,
Suche mir zuerst das erste Geburtsjahr und das letzte Sterbejahr heraus(bzw. setzte einen Anfangs und Endpunkt – aber das ist erst später interessant). Weiß also jetzt wieviele Tabellenzellen es geben wird. Dann schreibe ich eine erste Zeile mit den jeweiligen Jahresangaben.
Das verstehe ich nicht. Warum weißt Du aufgrund des ersten Geburts- und des letzten Sterbejahres, wieviele Einträge in der Tabelle stehen?
OK, das habe ich flasch fomuliert. Ich weiß dadurch wieviele <td> die <tr> haben
Nun kann ich natürlich für jeden DB-Eintrag eine Tabellenzeile schreiben und den Zeitraum darin eintragen, das führt aber zu einer langen unübersichtlichen Tabelle mit viel verschwendeten Platz.
Lieber würde ich es so machen, dass wenn mehrere Einträge in eine Zeile passen würden (also z.B. Person_1 1829 – 1877; Person_5 1878 – 1920; Person_17 1925 – 1980; etc.) diese auch in eine Zeile geschrieben würden.Sollte kein Problem darstellen.
Doch, das ist leider für mich ein Problem.
Erster Eintrag geht bei <td 1> los und geht bis <td 50> ->lege eine <tr> an;
zweiter Eintrag geht bei <td 2> los und geht bis <td 75> -> also eine neue TR;
dritter Eintrag geht bei <td 52> los und geht bis <td120> -> würde also in erste <tr> passen und hier ist mein Problem, wie Frage ich das ab?
vierter Eintrag geht bei <td 60> los und geht bis <td 120> -> muß also wieder eine neue <tr> anlegen
etc. etc.
Das stellt mich allerdings vor das Problem, dass ich nicht weiß wieviele Tabelrows benötigt werden.
Verstehe ich nicht. [Anzahl der Einträge] / [Anzahl der Datensätze pro Zeile] und das ganze aufrunden.
Nein, weil ja ncht für jeden Eintrag eine neue <tr> geschrieben werden soll, sondern wenn mehrere Einträge in eine <tr> geschrieben werden können, dies auchgeschen soll.
Grüße,
Peter
Hi,
Erster Eintrag geht bei <td 1> los und geht bis <td 50> ->lege eine <tr> an;
Wieso geht der Eintrag „bei TD #1 los und geht bis TD #50"?
Ein Eintrag in einer Tabelle befindet sich in einer Tabellenzelle.
Vermutlich willst du Daten in einer Forn visualisieren, für die eine Tabelle gar nicht das geeignete Element ist.
*Wie* du sie darstellen willst, darüber hast du uns immer noch nicht informiert.
MfG ChrisB
Wieso geht der Eintrag „bei TD #1 los und geht bis TD #50"?
Ein Eintrag in einer Tabelle befindet sich in einer Tabellenzelle.
Vermutlich willst du Daten in einer Forn visualisieren, für die eine Tabelle gar nicht das geeignete Element ist.
*Wie* du sie darstellen willst, darüber hast du uns immer noch nicht informiert.
Hm, war anscheinend doch nicht so klar wie ich dachte:
<table>
<tr>
<td>1800</td><td>1801</td>etc.
</tr>
<tr>
<td colspan='50'>Person 1 geboren 1800 gestorben 1850</td>
<td colspan='2'></td>
<td colspan='73'>Person 7 geboren 1853 gestorben 1926</td>
etc.
</tr>
<tr>
<td colspan='3'>
<td colspan='63'>Person 2 geboren 1804 gestorben 1867</td>
<td colspan='85'>Person 5 geboren 1868 gestorben 85 Jhare später ;-) </td>
etc.
<tr>
etc. etc.
</table>
Grüße,
Peter
Ok,
neuer Versuch:
ich denke ich bekomme die Abfrage hin in welcher <tr> und wo in der <tr> der einzelne Eintrag zu stehen kommt (einstufiger Gruppenwechsel).
Mein Problem ist, dass ich nicht weiß wieviele <tr>s am Schluss da sein werden. Möchte also im Prinzip einfach ein Array erstellen, dass die jeweiligen <tr>s enthält und diese sobald die Abfrage und Eintrag der Datensätze beendet ist ausgegeben werden.
also quasi:
$tabelrow1=<tr>
$tablerow1.=<td colspan='52'>Eintrag1</td>
$tablerow1.=<td colspan'2'></td>
$tablerow1.=<td colspan='87'>Eintrag5</td>
$tablerow1.=<td colspan='7'></td>
$tablerow1.=</tr>
$tablerow2=<tr>
$tablerow2.=<td colspan='2'></td>
$tablerow2.=<td colspan='63'>Eintrag 3</td>
etc.etc.
echo $tablerow1;
echo $tablerow2;
etc.etc.
aber wie gesagt ich weiß nicht wieviele tablerows es geben wird, und da gibt es doch eine Array Funktion die mir ein solches Array automatisch erstellt. Und mich das Array am Ende auch wieder auslesen läßt...
Grüße,
Peter
Hallo,
und noch ein Versuch -> auf die benötigte Array Funktion beschränkt (die tatsächliche Darstellung ist sekundär):
DB-Abfrage liefert mir
$start
$ende
$eintrag
(stark vereinfacht)
$tabelrow=array();
$tr_nummer=0;
While (Ergebnis der DB Abfrage)
{
//--Falls erste Zeile
if($tr_nummer=='0')
{
$zeile=$tr_nummer;
$inhalt='$eintrag';
$letztesfeld=$ende; //--ist eine Zahl aus der DB Abfrage
}
$tablerow[$zeile]=array('inhalt' => $inhalt, 'letzter' => $letztesfeld);
$tr_nummer++;
}
else
{
IF (Suche im Array $tablerow[] einen Eintrag in dem 'letzter' kleiner ist als $start aus DB-Abfrage.)
{
schreibe $eintrag zum bestehenden 'inhalt' des Array Eintrags
ersetze 'letzter' mit neuem $ende Wert
}
ELSE
{
$zeile=$tr_nummer;
$inhalt='$eintrag';
$letztesfeld=$ende;
$tablerow[$zeile]=array('inhalt' => $inhalt, 'letzter' => $letztesfeld);
$tr_nummer++;
}
}
}
Dann durchsuche jedes Eintrag des Array $tablerow[] nach Element 'letzter' und falls jeweiliger letzter kleiner ist als vorgegebene Zahl ergänze den Inhalt mit definiertem Wert ansonsten ergänze Inhalt mit anderem definiertem Wert.
Dann gib für jedes Eintrag des Array $tablerow[] das Element 'inhalt' aus.
Wie durchsuche ich das Array nach dem bestimmten Eintrag und ergänze den Eintrag 'inhalt' mit weiterer Information aus der DB Abfrage?
Grüße,
Peter
Hallo,
Wieso geht der Eintrag „bei TD #1 los und geht bis TD #50"?
Vermutlich willst du Daten in einer Forn visualisieren, für die eine Tabelle gar nicht das geeignete Element ist.
Treffer, versenkt :-)
*Wie* du sie darstellen willst, darüber hast du uns immer noch nicht informiert.
<td>1800</td><td>1801</td>etc.
</tr>
<tr>
<td colspan='50'>Person 1 geboren 1800 gestorben 1850</td>
<td colspan='2'></td>
<td colspan='73'>Person 7 geboren 1853 gestorben 1926</td>
etc.
Wie kann man tabellarische Daten, die aus einer Datenbank kommen *nichttabellarisch* darstellen.
Ein zu Deinem Problem analoges wird in einem aktuellen Thread behandelt.
Freundliche Grüße
Vinzenz
Hi Peter!
OK, das habe ich flasch fomuliert. Ich weiß dadurch wieviele <td> die <tr> haben
Auch das kann ich nicht nachvollziehen.
Erster Eintrag geht bei <td 1> los und geht bis <td 50> ->lege eine <tr> an;
zweiter Eintrag geht bei <td 2> los und geht bis <td 75> -> also eine neue TR;
dritter Eintrag geht bei <td 52> los und geht bis <td120> -> würde also in erste <tr> passen und hier ist mein Problem, wie Frage ich das ab?
vierter Eintrag geht bei <td 60> los und geht bis <td 120> -> muß also wieder eine neue <tr> anlegen
etc. etc.
Ich habe lange darüber nachgedacht, verstehe aber immer noch nicht, was Du haben willst. Bitte gib Beispieldaten an, also Inhalt der Datenbanktabelle und wie es dann in Tabellenform schlussendlich aussehen soll. Ich verstehe weder was genau jetzt ein "Eintrag" sein soll, noch warum ein solcher "Eintrag" von "<td 1>" bis "<td 50>" "geht". Geschweige denn, warum Eintrag drei jetzt in die erste tr "passen" würde.
Verstehe ich nicht. [Anzahl der Einträge] / [Anzahl der Datensätze pro Zeile] und das ganze aufrunden.
Nein, weil ja ncht für jeden Eintrag eine neue <tr> geschrieben werden soll, sondern wenn mehrere Einträge in eine <tr> geschrieben werden können, dies auchgeschen soll.
[Anzahl der Einträge] / [Anzahl der Datensätze pro Zeile] aufgerundet ergibt doch genau die Anzahl der benötigten Tabellenzeilen. Da das ganze aber sowieso am besten in einer Schleife abgearbeitet wird, brauchst Du das nichtmal.
mfG
Benjamin