Über mehrdimensionale Arrays iterieren (Thema: PHP Beispiele)

Darstellung zweier Wege, um über mehrdimensionale Arrays zu iterieren und deren Werte auszugeben

Für das Durchlaufen von mehrdimensionalen Arrays (als ein Array mit Unterarrays) reicht eine einfache foreach-Schleife nicht mehr aus.
Die Funktion array_walk_recursive($array, $callback) ist für diesen Anwendungsfall gedacht.
PHP-Code
<?php
	$arr = array(
			'farben'=>array('grün', 'rot', 'gelb'),
			'länder'=>array(
				'europa'=>array('großbritannien', 'spanien', 'schweden'),
				'asien'=>array('japan','china','indien')
			)
		);

	// Diese einfache Callback-Funktion gibt jedes Schlüssel-Wert-Paar aus
	$callback = function($value, $key) {
		echo("$value: $key, ");
	};

	array_walk_recursive($arr, $callback);
?>
Ausgabe
grün: 0, rot: 1, gelb: 2, großbritannien: 0, spanien: 1, schweden: 2, japan: 0, china: 1, indien: 2, 

Möglich ist es auch, sich eine eigene Funktion zu schreiben, die dann rekursiv aufgerufen wird.
PHP-Code
<?php
	// Beispiel-Array
	$arr = array(
			'farben'=>array('grün', 'rot', 'gelb'),
			'länder'=>array(
				'europa'=>array('großbritannien', 'spanien', 'schweden'),
				'asien'=>array('japan','china','indien')
			)
		);


	// Diese Funktion durchläuft rekursiv das mehrdimensionale Array
	// und gibt dieses "flach" zurück.
	// Aus array( 0=array('a', 'b', 'c'), 1=>array('x', 'y', 'z')
	// wird also array('a', 'b', 'c', 'x', 'y', 'z')
	function crawlArray($arr) {
		$out = array();
		foreach ($arr as $key=>$val) {
			if (is_array($val)) {
				$out = array_merge($out, crawlArray($val));
			} else {
				$out[] = $val;
			}
		}
		return $out;
	}
	
	$flat = crawlArray($arr);
	var_dump($flat);
?>
Ausgabe
array(9) {
  [0]=>
  string(4) "grün"
  [1]=>
  string(3) "rot"
  [2]=>
  string(4) "gelb"
  [3]=>
  string(14) "großbritannien"
  [4]=>
  string(7) "spanien"
  [5]=>
  string(8) "schweden"
  [6]=>
  string(5) "japan"
  [7]=>
  string(5) "china"
  [8]=>
  string(6) "indien"
}
In diesem Fall gehen durch die rekursive Funktion die Schlüssel verloren, da es sonst zu wahrscheinlich wäre, dass bei einem mehrdimensionalen Array mehrere Werte den selben Schlüssel haben (welche sich im „flachen” Array dann überschreiben würden).
Natürlich könnte man stattdessen auch jedes Schlüssel-Wert-Paar direkt per echo ausgeben.
Dafür müsste nur die foreach-Schleife geringfügig angepasst werden.
PHP-Code: Bisher (Rückgabe als eindimensionales Array)
if (is_array($val)) {
	$out = array_merge($out, crawlArray($val));
} else {
	$out[] = $val;
}
PHP-Code: Geändert (Direkte Ausgabe per echo)
if (is_array($val)) {
	crawlArray($val);
} else {
	echo("$key: $val, ");
}

Kommentare (0)

Von neu nach alt