1. Eindimensionales Array zu HTML-Liste
Die wohl einfachste Möglichkeit, ein Array in eine HTML-Liste umzuwandeln, ist die Verwendung einer foreach-Schleife. Diese muss nur über alle Elemente iterieren und jedes einzelne inklusive <li> und </li> („list item”) ausgeben. Das ganze wird noch mit <ul>...</ul> umschlossen („unordered list”). Bevor man das alles macht sollte man aber noch prüfen, ob das Array leer ist und gegebenenfalls eine passende Meldung anzeigen. Sonst erhält man eine Liste, die leer und damit nicht valide ist.
<?php $arr = array('a', 'b', 'c', 'd'); if (empty($arr)) { // Entsprechende Meldung falls Array leer ist echo("Die Liste ist leer.\n"); } else { // HTML-Liste starten echo("<ul>\n"); // Über alle Elemente im Array iterieren foreach ($arr as $val) { // Jedes einzelne Element als list item ausgeben // htmlentities() encodiert etwaige HTML-Zeichen // (ist optional, sollte aber bei der Ausgabe von Benutzereingaben immer durchgeführt werden) echo("<li>" . htmlentities($val, ENT_QUOTES, 'UTF-8') . "</li>\n"); } echo("</ul>\n"); } ?>
<ul> <li>a</li> <li>b</li> <li>c</li> <li>d</li> </ul>
2. Liste mit CSS-Klassen für Elemente an geraden/ungeraden Positionen
Im nächsten Beispiel wird die vorherige foreach-Schleife geringfügig überarbeitet. Diesmal soll sie jedem Wert eine CSS-Klasse zuweisen, welche sich abhängig von der Position unterscheidet: Alle Listeneinträge an gerader Position (Nullter, Zweiter, Vierter, ...) sollen die CSS-Klasse „even” bekommen, die anderen (ungeraden) die CSS-Klasse „odd”. Um dies zu erreichen wird mit jeder Iteration eine Zählvariable $x hochgezählt und jeweils darauf geprüft, ob sie gerade oder ungerade ist. (Dies kann über $x % 2 erreicht werden, was immer dann einen Wert ungleich 0 ergibt, wenn sich $x nicht glatt durch 2 teilen lässt.)
<?php $arr = array('a', 'b', 'c', 'd'); if (empty($arr)) { echo("Die Liste ist leer.\n"); } else { $x = 0; echo("<ul>\n"); foreach ($arr as $val) { // CSS-Klasse abhängig davon wählen, ob $x ungerade oder gerade ist $class = ($x % 2 ? "odd" : "even"); echo("<li class=\"$class\">" . htmlentities($val, ENT_QUOTES, 'UTF-8') . "</li>\n"); $x++; } echo("</ul>\n"); } ?>
<ul> <li class="even">a</li> <li class="odd">b</li> <li class="even">c</li> <li class="odd">d</li> </ul>
3. Mit Schlüsseln und Datentypen
Eine weitere Abänderung der foreach-Schleife zeigt das nächste Beispiel. Dieses gibt nicht nur den Wert, sondern auch den Schlüssel jedes Elements aus. Zusätzlich werden sowohl Schlüssel als auch Wert durch den Datentyp ergänzt, welcher über gettype($variable) ermittelt wird. Die Anwendung solch einer Schleife eignet sich in erster Linie für Debugging-Zwecke und für Ausgaben, die an einen normalen Benutzer gerichtet sind.
<?php $arr = array('a', 'b', 'c', 'd'); if (empty($arr)) { echo("Die Liste ist leer.\n"); } else { echo("<ul>\n"); foreach ($arr as $key=>$val) { echo("<li>[(".gettype($key).")".htmlentities($key, ENT_QUOTES, 'UTF-8')." => (".gettype($val).")".htmlentities($val, ENT_QUOTES, 'UTF-8')."]</li>\n"); } echo("</ul>\n"); } ?>
<ul> <li>[(integer)0 => (string)a]</li> <li>[(integer)1 => (string)b]</li> <li>[(integer)2 => (string)c]</li> <li>[(integer)3 => (string)d]</li> </ul>
4. Mehrdimensionales Array mit verschachtelten HTML-Listen ausgeben
Im nächsten Beispiel wird eine Funktion gezeigt, die mehrdimensionale Arrays ausgeben kann. Die Darstellung erfolgt über verschachtelte HTML-Listen. Letztlich kann der Großteil des Codes gleich bleiben. Vor der Ausgabe eines Listenelements muss aber geprüft werden, ob es sich um ein (Unter-)Array handelt. Falls ja, darf nicht einfach der Wert ausgegeben werden. Stattdessen muss mit diesem Unterarray wiederum die selbe Funktion (rekursiv) aufgerufen werden, um die Liste für das Unterarray zu erzeugen.
<?php // Die Funktion erwartet ein Array und eine Tiefenangabe // Die Tiefenangabe wird hier nur verwendet, um Tabs zu erzeugen, die wiederum // die HTML-Ausgabe verschönern bzw. lesbarer machen // (Listen und Listeneinträge sind dadurch korrekt eingerückt) function listToHtmlRecursive($arr, $depth) { // Tabs entsprechend der Verschachtelung generieren // *2, da jede Unter-Liste von <li><ul>...</ul></li> umschlossen ist $tabs = str_repeat("\t", $depth*2); $out = ""; if (empty($arr)) { // falls Array leer $out .= "$tabs<i>leer</i>"; } else { // falls Array nicht leer, // wird eine neue Liste gestartet $out .= "$tabs<ul>\n"; // über alle Elemente im Array iterieren foreach ($arr as $val) { $out .= "$tabs\t<li>\n"; if (is_array($val)) { // falls das Element wiederum ein Array ist, wird eine Unterliste generiert $out .= listToHtmlRecursive($val, $depth+1); } else { // falls das Element kein Array ist, wird nur der Wert ausgegeben $out .= $tabs . "\t\t" . htmlentities(strval($val), ENT_QUOTES, 'UTF-8') . "\n"; } $out .= "$tabs\t</li>\n"; } // gestartete Liste beenden $out .= "$tabs</ul>\n"; } return $out; } $arr = array('a', array('b', 'c'), 'd', array('e', array('f', 'g')), 'h'); echo(listToHtmlRecursive($arr, 0)); ?>
<ul> <li> a </li> <li> <ul> <li> b </li> <li> c </li> </ul> </li> <li> d </li> <li> <ul> <li> e </li> <li> <ul> <li> f </li> <li> g </li> </ul> </li> </ul> </li> <li> h </li> </ul>