PeteX: Mehrdimensionales Array als HTML Tabelle

Bin viell. nicht mehr ganz wach, aber komm einfach nicht auf
eine einfache Lösung das folgende Array als Tabelle ausgeben
zu lassen.

Dankbar für jeden Hinweis:
*Nebeneinander wär ja noch drin,
aber untereinander ? ...ratlos ich bin...

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

)

)

  1. Hi,

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

    sowas?
    <?php
    foreach (mayarr["wohnort"] as $key => $val):
    ?>
    <tr>
    <td><?=$val?></td>
    <td><?=isset($mayarr["alerts"][$key])? $mayarr["alerts"][$key] : ""?></td>
    <td><?=isset($mayarr["strasse"][$key])? $mayarr["strasse"][$key] : ""?></td>
    </tr>
    <?php endforeach ?>

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. Hallo Joachim,
      da habe ich mich leider falsch ausgedrückt.

      Das Problem ist, ich kenne die Werte und deren
      Anzahl nicht im Voraus (wohnort,plz,name, ...)
      Brauche also eine Funktion die
      als Parameter das Array bekommt.

      Aber vielen Dank für deine Mühe.

      Pete

      sowas?
      <?php
      foreach (mayarr["wohnort"] as $key => $val):
      ?>
      <tr>

      ......

      1. Hi,

        Das Problem ist, ich kenne die Werte und deren
        Anzahl nicht im Voraus (wohnort,plz,name, ...)

        aber Du kennst Doch die Struktur. Mach Dir halt ein Hilfsaarray mit den aktuell vorhandenen keys.

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Hallo Joachim,

          »»Mach Dir halt ein Hilfsaarray mit den aktuell vorhandenen keys.

          Hmmm,
          totaler Blackout im Moment, ich probiers später nochmal.

          Pete

  2. 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
    1. Hello,

      if (!isset($addresses[$colname][$index])
            {
              $$addresses[$colname][$index] = NULL;   ## man könnte ggf. auch false benutzen.
            }

      $addresses[$colname][$index] = NULL;   ## man könnte ggf. auch false benutzen.

      natürlich nur ein Dollar.

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

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
    2. Hallo Tom,
      du hast dir ja enorm Mühe gegeben.
      Vielen Dank dafür.

      Jetzt wo mein Kopf wieder klar ist, habe ich aber
      nochmal versucht das Ganze kürzer zu gestalten ud siehe da
      es geht wieder ;-)

      Vielleicht hast du ja noch Vorschläge dazu.
      Ich weiss ehrlich gesagt jetzt nicht inwieweit
      Vor und Nachteil zu deinem vorhanden sind.
      Wollte es halt überschaubar halten.

      --------------------------------------

      for($i = 0;$i<=5000;$i++) // 5000 ist beliebiger Wert
      {
          // Erste Ebene durchlaufen
          foreach($res as $tmpk){
          $cntrl .= $tmpk[$i];
            if(!$tmpk[$i]){$tmprow .='<td>&nbsp;</td>';}
            else{$tmprow .= '<td>'.$tmpk[$i].'</td>';}
          }

      // Beendet Schleife wenn alle Inhalte eines Indexes leer
              if(!$cntrl){break;}
              else{
              $row .= "\r\n<tr><td>$i</td>".$tmprow."</tr>";
              unset($cntrl);
              unset($tmprow);
              }

      }
      echo "<h1>$i</h1>"; // nur test

      echo "<table border=1>\r\n$row\r\n</table>"; // ausgabe

      ------------------------------------

      Pete

      1. Hello Pete,

        der Umgang mit "Zeilenarrays" oder "Spaltenarrays" wird öfter gefragt.
        Außerdem wird oft danach gefragt, wie man die Datenausgabe irgendwie automatisieren kann.

        Ich habe versucht, dass allgemeinverständlich rüberzubringen.

        Ich muss aber bemängeln, dass Dein Code unübersichtlich und auch auf den zweiten Blick noch nicht durchschaubar ist. Wenn Dir an Interaktion beim Programmdesign und Codedesign gelgen ist, dann solltest Du versuchen, mehr "Luft" und mehr Kommentare einzubauen.

        Auch die Verwendung "sprechender" Variablennamen hilft da weiter.

        Ich schau es mir gerne nochmal an, wen Du das etwas aufbereitet und kommentiert hast.

        Meine kognitiven Fähigkeiten sind aber etwas bequem geworden mit den Jahren. Die mögen keine Buchstabenhaufen mehr ;-))

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

        Tom

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