HTML/CSS Tabelle Spalten in Zeilen, Zeilen in Spalten?
Hallo zusammen,
ich brauche mal eure Hilfe weil ich im Internet nicht wirklich was dazu finde. Ich habe eine Datenbank, die ich als Tabelle ausgeben möchte. Jedoch soll der Tabellenkopf als Spalte und eine Spalte als Tabellenkopf angezeigt werden. Soweit ich weiß, kann man das Array, wo der Inhalt der DB gespeichert ist, nur zeilenweise, einzeln oder als Array ausgeben lassen, aber nicht spaltenweise. Ich meine Funktionen wie:
mysqli_fetch_object($inhalt),
mysqli_fetch_field($inhalt),
mysqli_fetch_assoc($inhalt),
Gibt es irgendwie eine andere Funktion oder vielleicht mit HTML oder CSS eine Möglichkeit, dass man die Tabelle anders anzeigen lassen kann? Bsp.:
Abteilung | Kunde | Server | IP
-----------+-------+--------+-----
Produktion | a | 1 | 20
| b | 2 | 30
-----------+-------+--------+-----
Qualität | c | 3 | 40
-----------+-------+--------+-----
Entwicklung| d | 4 | 50
| e | 5 | 60
als
Abteilung| Produktion | Qualität | Entwicklung
---------+------------+----------+------------
Kunde | a b | c | d e
---------+------------+----------+------------
Server | 1 2 | 3 | 4 5
---------+------------+----------+------------
IP | 20 30 | 40 | 50 60
Ich hoffe das ich einigermaßen den richtigen Gedankengang habe. Falls irgendwas unklar ist einfach fragen :)
Vielen Dank für eure Hilfe!
1 Antwort
Wie du die Ausgabe zusammenbaust, ist dir überlassen. Auch wenn du ein Array bekommst, welches die Datensätze nach Reihe speichert.
Beispiel:
$data = [ 0 => [ 1, 2, 3 ], 1 => [ 4, 5, 6 ], 2 => [ 7, 8, 9 ] ];
if (!empty($data)) {
for ($i = 0; $i < $numberOfColumns; ++$i) {
for ($j = 0; $j < count($data); ++$j) {
print $data[$j][$i]. " ";
}
print "<br>";
}
}
Ok, aber wenn ich angenommen die Werte aus der DB so im Array abspeichere
$data = mysqli_query($conn, $sql);
wie kann ich dann dem Array $data sagen, die ich die Daten so
$data = [ 0 => [ 1, 2, 3 ], 1 => [ 4, 5, 6 ], 2 => [ 7, 8, 9 ] ];
abgespeichert haben möchte? Wie kann ich das definieren, bzw. geht das überhaupt mit PHP? Danke.
Die mysqli_query-Funktion liefert dir einen ResultSet, kein Array. Das sind unterschiedliche Datenstrukturen. Du musst das ResultSet ($data) erst an die obig genannte Funktion übergeben, dann erhältst du ein Array.
$cells = mysqli_fetch_all($data);
Lasse dir im Anschluss das Array einmal ausgeben, um eine visuelle Vorstellung von dessen Struktur zu bekommen.
print_r($cells);
Achso ok, das wusste ich nicht. Ich hab mir mal das Array angeschaut und festgestellt, das jeder Datensatz eine Zeile ist. Auf die 1. Tabelle oben in der Frage bezogen, sieht das Array folgend aus:
Array
(
[0] => Array
(
[0] => Produktion
[1] => a
[2] => 1
[3] => 20
)
[1] => Array
(
[0] => Produktion
[1] => b
[2] => 2
[3] => 30
)
[2] => Array
(
[0] => Qualität
[1] => c
[2] => 3
[3] => 40
)
[3] => Array
(
[0] => Entwicklung
[1] => d
[2] => 4
[3] => 50
)
[4] => Array
(
[0] => Entwicklung
[1] => e
[2] => 5
[3] => 60
)
)
Bei der 2. Tabelle in der Frage müssten ja dann die Spalten jeweils einen Datensatz haben oder? Danke für deine Hilfe, wirklich :)
Deine Ausgabe zeigt, dass du nun genau die Form hast, wie sie in deiner ursprünglichen Fragestellung hattest und wie sie auch im Beispiel meiner Antwort vorliegt. Würdest du nun den Algorithmus (die verschachtelten Schleifen) darauf anwenden, würdest du wie erwartet die spaltenweise Ausgabe erhalten.
Um nun aber Tabellenzellen zusammenzufassen, sollte ein Zwischenschritt vorgenommen werden, bei dem bspw. anhand des ersten Eintrags je Datensatz bestimmt wird, ob er mit dem vorherigen zusammengefasst wird. Das Ergebnis wird in ein neues Array $filtered gespeichert.
$filtered = array();
for ($row = 0; $row < count($data); ++$row) {
if ($row != 0 && $data[$row][0] === $data[$row - 1][0]) {
$entry = array($data[$row][0]);
for ($column = 1; $column < $numberOfColumns; ++$column) {
$entry[] = $data[$row - 1][$column] . " " . $data[$row][$column];
}
$filtered[count($filtered) - 1] = $entry;
continue;
}
$filtered[] = $data[$row];
}
Wow, danke für deine Hilfe. Ich habe es jetzt endlich verstanden wie du es gemeint hast. Sorry das ich die Fragestellung nochmal geändert habe, ich dachte mir eine richtige Tabelle ist ein besseres Beispiel. Ich hab eigentlich geschaut, dass keine Antworten da sind, hat aber nicht so geklappt, paar Sekunden später kam deine.
Das die Tabellenzellen zusammengefügt werden müssen ist mir später auch aufgefallen, da habe ich überlegt, dass irgendwie mit dem SQL-Befehl GROUP_CONCAT zu lösen. Du hast da aber eine effiziente Weise gefunden. Ich bin dir echt dankbar, alleine hätte ich das nicht hingekriegt :)
Ich wollte dich mal noch fragen, wie man die Spalten in Zeilen umwandelt, wenn für jede Zeile ein eigenes Array erstellt wird, wie z.B. bei der Funktion mysqli_fetch_array. Dann kann man ja leider nicht mehr das Array ($data) einzeln ansprechen...
Also angenommen das Array sieht so aus
Array
(
[0] => Produktion
[1] => a
[2] => 1
[3] => 20
)
Array
(
[0] => Produktion
[1] => b
[2] => 2
[3] => 30
)
Array
(
[0] => Qualität
[1] => c
[2] => 3
[3] => 40
)
Array
(
[0] => Entwicklung
[1] => d
[2] => 4
[3] => 50
)
Array
(
[0] => Entwicklung
[1] => e
[2] => 5
[3] => 60
)
Kann man eventuell ein Array um die ganzen einzelnen Arrays machen und dann das ansprechen? Ich habe es mit
$alldata = array($data);
versucht, damit wird aber nur das erste Array, also die erste Zeile verschachtelt, nicht alle Arrays. Der Grund warum ich das so machen möchte ist das ich keine MySQL DB habe, sondern eine MSSQL DB. Da gibt es soweit ich weiß keinen Befehl, der die Werte in verschachtelte Arrays speichert, sondern für jede Zeile ein einzelnes Array. Hast du eine Idee? Ich bin schon die ganze Zeit am überlegen...
Danke für die schnelle Antwort und der Idee!
Sowas ähnliches hab ich schon im Internet gefunden, aber da hab ich mir die Frage gestellt, ob man direkt sagen dass die Werte aus der DB so in dem Array gespeichert werden können. Dann könnte man die Werte ja auch mit
ausgeben, oder?