2012-04-06 10 views
1

Anstatt einen einzigen Callback über das gesamte Array laufen zu lassen (wie array_map), würde ich gerne wissen, ob es eine Funktion gibt, die ein Array von Callbacks filtert Wert.Einen Wert einem Array von Callbacks zuordnen (Umkehrung von array_map)

$value = 'foo'; 

$closures = array(
    function($value) { return $value . 'bar'; } 
    function($value) { return $value . 'baz'; } 
); 

// Something other than a foreach with call_user_func? 
// $value = array_callbacks($closures, $value); 

// vs 
foreach ($closures as $callback) 
{ 
    $value = call_user_func($callback, $value); 
} 

print $value; // foobarbaz 

Antwort

2

Das, was Sie beschreiben, wird in funktionaler Programmierung "reduce" oder "fold" genannt, nicht "map", da Sie versuchen, einen Wert über die Werteliste der Reihe nach zu verarbeiten, anstatt eine Liste der Werte zu sammeln Ergebnisse der Anwendung jedes Elements auf den ursprünglichen Wert.

Die folgenden Werke:

<? 
$value = 'foo'; 

$closures = array(
    function($value) { return $value . 'bar'; }, 
    function($value) { return $value . 'baz'; } 
); 


print array_reduce($closures, 
        function ($value, $callback) { return $callback($value); }, 
        $value); 
?> 

Aber ich mit den anderen Plakaten einverstanden, dass es vielleicht einfacher sein foreach zu verwenden. Es ist mühsam, in PHP funktionale Dinge zu tun.

2

Ich denke, die Art, wie Sie es tun, ist jetzt die richtige. Soweit mir bekannt ist, gibt es keine "Reverse Array Map".

Sie könnten eine "Wrapper" -Funktion um die Callbacks herum erstellen, die jede der Reihe nach aufruft und diese mit array_map anwendet, aber ich glaube nicht, dass Sie daraus einen echten Vorteil gegenüber dem foreach-Ansatz ziehen würden.

+1

Foreach ist eigentlich sauber, einfach und macht was OP will. PHP benötigt wirklich eine Möglichkeit, viele häufige Aufgaben zu vereinfachen, aber diese Aufgabe gehört nicht dazu. +1 – Tadeck

Verwandte Themen