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) }