Tom: Spaltenarray als HTML Tabelle ausgeben

Beitrag lesen

Hello,

Rauskommen soll:

wohnort    alerts           strasse
         | wohnort leer     |strasse
04318    |                  |TheodorNeubauerStrasse
57074    |                  |Auf der Hohenfuhr
96049    |                  |Untere Sandstrasse
95445    |                  |St.NikolausStr.
28203    |                  |eschenstr.
26180    |                  |Holunderweg a


Array
(
    [wohnort] => Array
        (
            [0] =>
            [1] => 04318
            [2] => 57074
            [3] => 96049
            [4] => 95445
            [5] => 28203
            [6] => 26180

)

[alerts] => Array
        (
            [0] => wohnort leer;
        )

[strasse] => Array
        (
            [0] => strasse
            [1] => TheodorNeubauerStrasse
            [2] => Auf der Hohenfuhr
            [3] => Untere Sandstrasse
            [4] => St.NikolausStr.
            [5] => eschenstr.
            [6] => Holunderweg a

)

)

Ich lasse das Quoting mal absichtlich drin stehen.

Erstmal herzlichen Glückwunsch zum Aufbau des Arrays als "Spaltenarray". Das ist der empfohlene Aufbau aus zwei Gründen:

1. es spart erheblichen Overhead bei den Bezeichnern
   Jeder Splatenbezeichner muss nur einmal vorkommen

2. Bei der Umwandlung in eine HTML-Tabelle stehen alle relavanten Größen
   sofort zur Verfügung. Bei einer HTML-Tabelle sit nämlich nicht die
   Länge begrenzt, sondern die Anzahl der Spalten muss in jeder Zeile
   gleich sein.

Die Anzahl der Spalten und deren Überschriften ergibt sich aber als Anzahl der Keys der ersten Dimension. Da Du die Überschriften ggf. benötigst (eventuell sigar auf jeder Bildschirmseite, wenn Du blättern lassen willst), bsorgst Du Dir als erstes die Paltennamen:

$_colnames = array_keys($_addresses);   ## ich nenne das Ding nun mal $_addresses

Die Elemente jeder einzelnen Spalte sollten korrespondieren, also sollte es in jeder Spalte jeden Index geben, auch wenn er keinen Wert enthält. Anderenfalls ist bereits im Vorfeld 'was schiefgegangen und Du musst es hier erst reparieren.

Ich würde das nicht On-The-Fly (also während der Ausgabefunktion) machen, sondern eine Separate Funktion dafür schreiben.

1. Schritt
  besorgen des kleinsten und des größten Index über alle Spalten:

$min=0;
  $max=0;

foreach($_colnames as $colname)
  {
    foreach($_addresses[$colname] as $key => $val)
    {
      $min = min($min,$key);
      $max = max($max,$key);
    }
  }

Wenn Du willst, kannst Du nun das Array erstmal "reparieren". Man sollte dabei aber an den zusätzlichen Speicherbedarf für die Leerelemente denken.

for($index = $min, $index <= $max, $index++)
  {
    foreach($_colnames as $colname)
    {
      if (!isset($addresses[$colname][$index])
      {
        $$addresses[$colname][$index] = NULL;   ## man könnte ggf. auch false benutzen.
      }
    }
  }

Nun liegt das Array in einer vollständigen Spaltenform vor.

Du kannst es also nun rein mechanisch ausgeben lassen.

echo "<table class="adressen">\n";
  echo "  <tr>\n";

foreach($_colnames as $colname)
  {
    echo "    <th class="adresse">".htmlentities($colname)."</th>\n";
  }

echo "  </tr>\n";

#--- nach Index sortiert ausgeben

for($index = $min, $index <= $max, $index++)
  {
    echo "  <tr>\n";
    foreach($_colnames as $colname)
    {
      echo "      <td class="adresse">.htmlentities($_addresses[$colname][$index])."</td>\n";
    }
    echo "  </tr>\n";
  }

#---

#--- oder nach einer Spalte sortiert ausgeben

foreach($_addresses[$leitspalte] as $key => $val)   ## hierzu MUSS das Array vollständig sein!
  {
    echo "  <tr>\n";
    foreach($_colnames as $colname)
    {
      echo "      <td class="adresse">.htmlentities($_addresses[$colname][$key])."</td>\n";
    }
    echo "  </tr>\n";
  }

#---

echo "</table>\n";

In der Regel sollte das Splatenarray vollständig sein und der Wertebereich der Indexe bekannt
sein, da es irgendwie über eine Abfrage entstanden sein wird.

Ein weiterer beim Spaltenarray ist dann, dass man sofort nach jeder Spalte sortieren kann.
Die gewünschte nach Werten sortierte Spalte muss man dann nur als Leitspalte benutzen.

Ich hoffe, dass keine Bugs drin sind und ich Dir helfen konnte

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau