HTML/CSS Tabelle Spalten in Zeilen, Zeilen in Spalten?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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>";
  }
}
chalaa 
Fragesteller
 07.09.2021, 14:54

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

mysqli_fetch_row($inhalt);

ausgeben, oder?

0
chalaa 
Fragesteller
 07.09.2021, 15:13
@regex9

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.

0
regex9  07.09.2021, 15:37
@chalaa

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);
1
chalaa 
Fragesteller
 07.09.2021, 16:26
@regex9

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 :)

0
regex9  08.09.2021, 05:21
@chalaa

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];
}
1
chalaa 
Fragesteller
 08.09.2021, 11:55
@regex9

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 :)

0
chalaa 
Fragesteller
 09.09.2021, 13:29
@regex9

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...

0
regex9  09.09.2021, 14:18
@chalaa

Nimm eine Schleife:

$allData = array();

while ($row = sqlsrv_fetch_array($statement, SQLSRV_FETCH_NUMERIC)) {
  $allData[] = $row;
}

Mit sqlsrv_fetch_array wird ein Datensatz nach dem nächsten aus dem ResultSet geholt und in $allData eingefügt.

1
chalaa 
Fragesteller
 09.09.2021, 14:34
@regex9

ok vielen Dank, damit ist das Problem ist das Problem entgültig gelöst :)

0