Ein Array als Liste oder Baum ausgeben (Thema: PHP Beispiele)

Wie ein Array in PHP als HTML-Liste oder als baumartige Darstellung ausgegeben werden kann

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-Code: Skript zur Ausgabe eines Arrays als HTML-Liste
<?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");
	}
?>

HTML-Code: Ausgabe
<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-Code: Listenelemente durch CSS-Klassen ergänzen
<?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");
	}
?>

HTML-Code: Ausgabe
<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-Code: Debug-Ausgabe eines Arrays in HTML
<?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')." =&gt; (".gettype($val).")".htmlentities($val, ENT_QUOTES, 'UTF-8')."]</li>\n");
		}
		echo("</ul>\n");
	}
?>

HTML-Code: Ausgabe
<ul>
<li>[(integer)0 =&gt; (string)a]</li>
<li>[(integer)1 =&gt; (string)b]</li>
<li>[(integer)2 =&gt; (string)c]</li>
<li>[(integer)3 =&gt; (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-Code: Mehrdimensionales Array als verschachtelte HTML-Liste/Baum ausgeben
<?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));
?>

HTML-Code: Ausgabe
<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>


Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung. OK