Eine Funktion auf alle Werte in einem Array anwenden (Thema: PHP Beispiele)

Beschreibung wie man ein Array durchlaufen und dabei eine bestimmte Funktion auf alle Werte in diesem Array anwenden kann.

1. Eindimensionales Array und array_map()


Um eine Callback-Funktion auf alle Werte in einem eindimensionalen Array anzuwenden kann array_map($callback, $array) verwendet werden.
Die Callback-Funktion muss einen Wert als Parameter annehmen und wiederum einen Wert zurückgeben, ihr Aufbau lautet demnach in etwa: function($wert) { return $neuerWert; }.
PHP-Code
<?php
	$arr = array(10, 20, 30, 40, 50);
	$timesTwo = function($value) { return $value*2; };
	$arr = array_map($timesTwo, $arr);
	var_dump($arr);
?>
Ausgabe
array(5) {
  [0]=>
  int(20)
  [1]=>
  int(40)
  [2]=>
  int(60)
  [3]=>
  int(80)
  [4]=>
  int(100)
}

1.1. Alle Werte im Array in Integer umwandeln


Mit Hilfe von array_map() können leicht alle Werte in einem Array zu Integern umgewandelt werden.
Die einfachste Version ist:
PHP-Code
<?php
	$arr = array(10, 20, '30', '40a', 50);
	$arr = array_map('intval', $arr); // wendet intval() auf alle Werte im Array an
	var_dump($arr);
?>
Ausgabe
array(5) {
  [0]=>
  int(10)
  [1]=>
  int(20)
  [2]=>
  int(30)
  [3]=>
  int(40)
  [4]=>
  int(50)
}

1.2. Alle Werte im Array in Strings umwandeln


Alle Werte in einem Array können wir folgt in den Datentyp „String” umgewandelt werden:
PHP-Code
<?php
	$arr = array(10, 20, '30', '40a', 50);
	$arr = array_map('strval', $arr); // wendet strval() auf alle Werte im Array an
	var_dump($arr);
?>
Ausgabe
array(5) {
  [0]=>
  string(2) "10"
  [1]=>
  string(2) "20"
  [2]=>
  string(2) "30"
  [3]=>
  string(3) "40a"
  [4]=>
  string(2) "50"
}

1.3. Alle nicht-skalaren im Array Werte zu -1 umwandeln


Die Callback-Funktion kann so angepasst werden, dass zum Beispiel alle nicht skalaren Werte (heißt: alles was nicht Integer, Float, String, Boolean oder Float ist) zu -1 umgewandelt werden und der Rest in einen Integer-Wert.
PHP-Code
<?php
	$arr = array(10, 20, array(), '30', '40a', 50, function() { } );
	$callback = function($value) { return (is_scalar($value)) ? intval($value) : -1; };
	var_dump(array_map($callback, $arr));
?>
Ausgabe
array(7) {
  [0]=>
  int(10)
  [1]=>
  int(20)
  [2]=>
  int(-1)
  [3]=>
  int(30)
  [4]=>
  int(40)
  [5]=>
  int(50)
  [6]=>
  int(-1)
}

2. Eindimensionales Array, foreach-Schleife


Statt array_map() kann auch eine foreach-Schleife verwendet werden, um eine Funktion auf alle Werte des Arrays anzuwenden:
PHP-Code
<?php
	$arr = array(10, 20, '30', '40a', 50);
	foreach ($arr as $key=>$val) {
		$arr[$key] = intval($val); // jeder Wert wird in Integer umgewandelt
	}
	var_dump($arr);
?>
Ausgabe
array(5) {
  [0]=>
  int(10)
  [1]=>
  int(20)
  [2]=>
  int(30)
  [3]=>
  int(40)
  [4]=>
  int(50)
}

3. Mehrdimensionales Array, array_walk_recursive()


array_walk_recursive() durchläuft ein Array und übergibt jedes Schlüssel-Wert-Paar an eine Callback-Funktion (mit Ausnahme von Schlüssel-Wert-Paaren bei denen der Wert wiederum ein Array ist).
Dieses Verhalten kann ausgenutzt werden, um die Werte im Array zu verändern.
PHP-Code
<?php
	$arr = array('100', array('50', 27), 1.3);
	// Die Werte werden per Referenz übergeben.
	// Jede Änderung an $value wirkt sich dann auf den entsprechenden Wert im Array genauso aus.
	$cb = function(&$value, $key) {
		$value = intval($value);
	};
	array_walk_recursive($arr, $cb);
	var_dump($arr);
?>
Ausgabe
array(3) {
  [0]=>
  int(100)
  [1]=>
  array(2) {
    [0]=>
    int(50)
    [1]=>
    int(27)
  }
  [2]=>
  int(1)
}

4. Mehrdimensionales Array, rekursiv aufgerufene Funktion


Alternativ zu array_walk_recursive() kann auch eine eigene Funktion implementiert werden, welche eine Callback-Funktion auf alle Werte anwendet.
PHP-Code
<?php
	function array_map_recursive($cb, $arr) {
		foreach ($arr as $key=>$val) {
			if (is_array($val)) {
				// Der Wert ist ein Array, array_map_recursive wird also wiederum auf dieses
				// Array angewendet und das Ergebnis dem Schlüssel zugewiesen
				$arr[$key] = array_map_recursive($cb, $val);
			} else {
				// Der Wert ist kein Array, die Callback-Funktion wird daher auf diesen Wert angewendet
				// und der neue Wert ersetzt den alten
				$arr[$key] = $cb($val);
			}
		}
		// Das geänderte Array wird zurückgegeben
		return $arr;
	}

	$arr = array('100', array('50', 27), 1.3);
	$cb = function($val) {
		return intval($val);
	};
	$arr = array_map_recursive($cb, $arr);
	var_dump($arr);
?>
Ausgabe
array(3) {
  [0]=>
  int(100)
  [1]=>
  array(2) {
    [0]=>
    int(50)
    [1]=>
    int(27)
  }
  [2]=>
  int(1)
}

Kommentare (0)

Von neu nach alt