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