Die Vernachlässigten: array_walk, array_filter, array_reduce und array_map

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.

Weitere Posts:

Dieser Beitrag wurde unter php, webdev veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.