2012-04-06 36 views
1

而不是單個回調遍歷整個數組(如array_map),我想知道是否有一個函數有一個回調數組過濾值。將一個值映射到一個回調數組(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 

回答

2

你所描述的在函數式編程中被稱爲「縮小」或「摺疊」,而不是「映射」,因爲你試圖按順序通過值列表來處理值,而不是收集列表將每個元素應用於原始值的結果。

以下工作:

<? 
$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); 
?> 

但我與其他海報,這可能是簡單的使用foreach同意。嘗試在PHP中使用功能性的東西是一種痛苦。

2

我認爲你現在做的方式是正確的。據我所知,沒有「反向陣列圖」。

你可以在回調函數週圍創建一個「包裝器」函數,然後依次調用array_map,但我認爲你不會從foreach方法中獲得任何真正的好處。

+1

Foreach實際上是乾淨的,簡單的,並且做OP想要的。 PHP真的需要一種方法來簡化許多常見的任務,但這個任務不是其中之一。 +1 – Tadeck 2012-04-06 20:20:57