Über Arrays iterieren (Thema: PHP Beispiele)

Beschreibung verschiedenster Möglichkeiten, um über ein eindimensionales Array zu iterieren

1. Durchlaufen mittels foreach


Zum Iterieren über ein Array existiert eine spezielle Schleife, die sehr häufig verwendet und gleichzeitig auch einfach zu merken ist: Die Foreach-Schleife. Die Schreibweise lautet foreach ($array as $schluesselname=>$wertname) { ... }, wobei $array das zu durchlaufende Array ist, $schluesselname der Name der Variable, die bei jeder einzelnen Iteration den Schlüssel enthalten soll und $wertname analog der Name der Variable, die jeweils den Wert zum Schlüssel enthält. Benötigt man nicht die Schlüssel, kann auch foreach ($array as $wertname) { ... } verwendet werden.
PHP-Code
<?php
	$arr = array(1, 2, 3, 'tier1'=>'hund', 'tier2'=>'katze', 'tier3'=>'maus');
	// Diese foreach-Schleife gibt alle Werte des Arrays (jeweils mit Schlüssel) aus
	foreach ($arr as $key=>$val) {
		echo("$key: $val, ");
	}
?>
Ausgabe
0: 1, 1: 2, 2: 3, tier1: hund, tier2: katze, tier3: maus, 

2. Mit for-Schleife


Ebenfalls häufig verwendet wird die for-Schleife.
Sind die Schlüssel des Arrays fortlaufend nummerierte Integer, beginnend bei (0, 1, 2, 3, 4, ...), kann folgende for-Schleife verwendet werden:
PHP-Code
<?php
	$arr = array('eins', 'zwei', 'drei');

	// $c ist die Anzahl der Elemente im Array
	// Man sollte NICHT schreiben "for ($x=0; $x<count($arr); $x++)"
	// da dies bei jeder Iteration die Elemente im Array neu durchzählt und daher deutlich langsamer ist
	for ($x=0, $c=count($arr); $x<$c; $x++) {
		echo("$x: {$arr[$x]}, ");
	}
?>
Ausgabe
0: eins, 1: zwei, 2: drei, 

Sind die Schlüssel keine Integer oder nicht fortlaufend nummeriert, kann eine der folgenden beiden Techniken angewendet werden:
PHP-Code
<?php
	$arr = array(0=>'eins', 5=>'zwei', 'foo'=>'drei');

	// Diese for-Schleife bildet kurzerhand ein neues Array, welches nur die Werte enthält
	// (mit Integer-Schlüssel, fortlaufend nummeriert, beginnend bei 0)
	// entsprechend gehen die Schlüssel verloren
	for ($x=0, $a=array_values($arr), $c=count($a); $x<$c; $x++) {
		echo($a[$x].", ");
	}
	echo("\n");

	// Diese for-Schleife bildet ein Array mit allen Schlüssel, durchläuft dieses nacheinander
	// und greift dann mit dem jeweiligen Schlüssel auf das ursprüngliche Array zurück
	for ($x=0, $keys=array_keys($arr), $c=count($keys); $x<$c; $x++) {
		echo($keys[$x].": ".$arr[$keys[$x]].", ");
	}
?>
Ausgabe
eins, zwei, drei, 
0: eins, 5: zwei, foo: drei, 

3. Das Array mit array_walk() oder array_map() durchlaufen


Die Funktionen array_walk(), array_walk_recursive() und array_map() sind dafür gedacht, dem Anwender beim Durchlaufen von Arrays zu helfen.
In diesem konkreten Anwendungsfall (Ausgabe von Schlüssel und Wert) sind array_walk() und array_walk_recursive() besonders geeignet.
array_map() ist eigentlich eher dafür gedacht, Werte eines Arrays zu ändern.
Alle drei Funktionen erwarten eine Callback-Funktion, die ihnen mitteilt, was sie mit den Werten (und Schlüsseln) machen sollen.

PHP-Code
<?php
	$arr = array(0=>'eins', 5=>'zwei', 'foo'=>'drei');

	// Durchlaufen mittels array_walk
	array_walk($arr, function($value, $key) { echo("$key: $value, "); });
	echo("\n");

	// array_walk_recursive()
	// Dieses ist für mehrdimensionale Arrays gedacht, kann aber genauso auch auf eindimensionale
	// Arrays angewendet werden
	array_walk_recursive($arr, function($value, $key) { echo("$key: $value, "); });
	echo("\n");

	// Array mit array_map durchlaufen
	// Keys werden nicht beachtet.
	// (Die Funktion ist eigentlich nicht zum Ausgaben, sondern zum Verändern von Array-Werten
	// gedacht. Für das Ausgaben ist array_walk() besser geeignet.)
	array_map(function($value) { echo("$value, "); return $value; }, $arr);
?>
Ausgabe
0: eins, 5: zwei, foo: drei, 
0: eins, 5: zwei, foo: drei, 
eins, zwei, drei, 

4. Ungewöhnlichere Varianten


Ein Array kann mit Hilfe von each() und einer while-Schleife durchlaufen werden.
each() gibt den Schlüssel und den Wert des Arrays an der aktuellen Position des internen Array-Zeigers zurück.
Anschließend setzt es den Array-Zeiger auf das nächste Schlüssel-Wert-Paar.

PHP-Code
<?php
	$arr = array(0=>'eins', 5=>'zwei', 'foo'=>'drei');
	reset($arr); // setzt den internen Array-Zeiger auf das erste Schlüssel-Wert-Paar
	while ($keyAndValue = each($arr)) {
		echo($keyAndValue['key'].': '.$keyAndValue['value'].', ');
	}
?>
Ausgabe
0: eins, 5: zwei, foo: drei, 


Ähnlich zum vorhergehenden Beispiel funktioniert das Durchlaufen des Arrays mit den Funktionen current(), key() und next().
current() gibt den Wert des Schlüssel-Wert-Paars zurück auf das der interne Array-Zeiger aktuell zeigt.
Analog dazu gibt key() den Schlüssel dieses Paares zurück.
Mit next() wird der Array-Zeiger auf das nächste Schlüssel-Wert-Paar gesetzt.
PHP-Code
<?php
	$arr = array(0=>'eins', 5=>'zwei', 'foo'=>'drei');
	reset($arr);
	while (current($arr)!==false) {
		$key = key($arr);
		$value = current($arr);
		echo("$key: $value, ");
		next($arr);
	}
?>
Ausgabe
0: eins, 5: zwei, foo: drei, 

Ebenfalls verwendet werden kann die Funktion array_shift($array).
Diese gibt den ersten Wert des Arrays zurück und kürzt anschließend des Array um diesen Wert.
So kann Schritt für Schritt das jeweils erste Element des Arrays entfernt und ausgegeben werden.
Das ursprüngliche Array geht dabei verloren und sollte daher zuvor kopiert werden.
PHP-Code
<?php
	$arr = array(0=>'eins', 5=>'zwei', 'foo'=>'drei');
	reset($arr);
	while ($value = array_shift($arr)) {
		echo($value.", ");
	}
?>
Ausgabe
eins, zwei, drei, 

Mit array_slice() wird ein Bereich eines Arrays „ausgeschnitten” und kann weiterverarbeitet werden.
Setzt man die Länge des Bereichs auf 1, kann jeweils ein Element nach dem anderen ausgelesen werden.
Die Funktion gibt allerdings Schlüssel-Wert-Paare zurück, sodass man wieder zwangsweise auf key() und current()
oder alternativ auf array_keys() und array_values() zurückgreifen muss.
PHP-Code
<?php
	$arr = array(0=>'eins', 5=>'zwei', 'foo'=>'drei');
	for ($x=0, $c=count($arr); $x<$c; $x++) {
		$subArr = array_slice($arr, $x, 1, true);
		$key = key($subArr);
		$value = current($subArr);
		echo("$key: $value, ");
	}
?>
Ausgabe
0: eins, 5: zwei, foo: drei, 

Kommentare (2)

Von neu nach alt
Anfang































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































PlaCeHoLdEr Vol.2 (Gast) #
MITTE erreicht








































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Ziel erreicht
PlaCeHoLdEr (Gast) #