如何在Closure中更改引用传递数组的数据

时间:2013-12-20 11:56:39

标签: php arrays reference closures

我有一个Eventbus,它将过滤器名称作为其第一个参数,将Closure作为第二个参数。像这样:

$this->EventBus->subscribe('FilterTestEvent', function(){/*Do Something*/});

它被称为:

$filteredValue = $this->EventBus->filter('FilterTestEvent', $anyValue);

我现在想要的是传递一个数组作为Closure的引用,然后以任何方式更改(此处:添加元素),然后返回一些作为过滤值:

$item_to_change = array('e1' => 'v1', 'e2' => 'v2');

$this->EventBus->subscribe('FilterTestEvent', function(&$item){
    $item['new'] = 'LoremIpsum';

    return true;
});

$filtered = $this->EventBus->filter('FilterTestEvent', $item_to_change);

现在我希望print_r($item_to_change)看起来如下:

Array
(
    [e1] => v1
    [e2] => v2
    [new] => LoremIpsum
)

但它看起来像原始数组:

Array
(
    [e1] => v1
    [e2] => v2
)

eventbus内部存储所有闭包,如果需要,通过call_user_func_array()调用它们,闭包作为第一个参数,值作为唯一的参数数组元素。

我如何实现其意图?

Eventbus的源代码:http://goo.gl/LAAO7B

2 个答案:

答案 0 :(得分:0)

可能这一行:

$filtered = $this->EventBus->filter('FilterTestEvent', $item_to_change);

应该{​​{1}}一个新的过滤数组,而不是修改原始数组。

所以检查一下:

return

通过修改函数(添加print_r($filtered); ):

可以通过引用传递
&

修改


让你的回调返回过滤后的数组:

function filter(&$array){  //Note & mark
  $array['new_index'] = "Something new" ;
}

$array = array("a"=> "a");
filter($array); //The function now receives the array by reference, not by value.
var_dump($array); //The array should be modified.

通过引用传递不应该在这里工作,因为在源代码中$this->EventBus->subscribe('FilterTestEvent', function(&$item){ $item['new'] = 'LoremIpsum'; return $item ; }); 变量与另一个值交换并在之后返回。

答案 1 :(得分:0)

确定。我找到了答案。需要更改过滤器函数,以便它接受数组作为值,我可以在其中保存引用。有关详细信息,请参阅Eventbus源代码的修订版1和修订版2,其中:goo.gl/GBocgl