Bisher war die Syntax der oben aufgeführten Funktionen ziemlich unsexy, da sie mit Callbacks arbeiten und dieser dann als String übergeben werden musste. Durch anonyme Funktionen in PHP 5.3 mutet das alles wesentlich „smoother“ an, sodass ich mir mal die genannten Funktionen genauer angesehen habe und nachfolgend kurz vorstelle.
array_walk – Der foreach-Ersatz
<?php $arr = array("audi a6" => 39500, "bmw m5" => 41200, "mercedes e300" => 43400); array_walk($arr,function($val,$key) { echo $key." = ".$val."<br />"; }); /* Output: audi a6 = 39500 bmw m5 = 41200 mercedes e300 = 43400 */
Also äquivalent zu foreach, das Array selbst bleibt unverändert. Wenn man jetzt das Array per Referenz übergibt, kann man das aktuell iterierte Element sogar noch manipulieren.
<?php $arr = array("audi a6" => 39500, "bmw m5" => 41200, "mercedes e300" => 43400); array_walk($arr,function(&$val,$key) { $val = $val * 1.05; }); print_r($arr); /* Array ( [audi a6] => 41475 [bmw m5] => 43260 [mercedes e300] => 45570 ) */
Auch das wäre aber noch mit foreach möglich:
foreach ($arr as $e => &$v) $v*=1.05;
array_filter: Bestimmte Elemente aus Array rauswerfen
Durch einen boolschen return in der Callback-Funktion lassen sich bestimmte Elemente aus dem Array herausfiltern:
<?php $arr = array("audi a6" => 39500, "bmw m5" => 41200, "mercedes e300" => 43400); //only cars cheaper than 40000 $res = array_filter($arr,function($val) { return $val < 40000; }); print_r($res); /* Array ( [audi a6] => 39500 ) */
array_reduce: Elemente aus dem Array auf eins reduzieren
<?php $a = array(1, 9, 3, 7, 100); $b = array_reduce($a, function($v, $w) { echo "$v + $w = ".($v + $w)."<br />"; return $v+$w; }); print "result: ".$b; /* Output: + 1 = 1 1 + 9 = 10 10 + 3 = 13 13 + 7 = 20 20 + 100 = 120 result: 120 */
array_map – Die Werte von einem/mehreren Arrays manipulieren
Erstmal mit einem Array:
<?php $a1 = array(1,3,3,7); $b = array_map(function($e) { return $e*$e*$e; }, $a1); print_r($b); /* Array ( [0] => 1 [1] => 27 [2] => 27 [3] => 343 ) */
Geht auch mit mehreren Arrays:
<?php $a1 = array(1, 2, 3, 4, 5); $a2 = array(2, 3, 4, 5, 6); $b = array_map(function($n1,$n2) { return $n1 * $n2; }, $a1, $a2); print_r($b); /* Array ( [0] => 2 [1] => 6 [2] => 12 [3] => 20 [4] => 30 ) */
Vielleicht ergibt sich ja mal eine Situation wo man diese zweifellos nützlichen Funktionen gewinnbringend anwenden kann.