2

我使用此代码触发事件:

$input = array(1,2,3);
$result = $EventManager->trigger('onChangeArray',$this,array('values'=>$input));
$c = $result->count();
$final = array();
for($i=0; $i<$c; $i++)
    $final = array_merge($final , $result->pop());

我想在附加函数中更改此数组。如果我添加到数组, $final 正确包含所有值;但我想在附加函数中从 $final 中删除一个值。我需要调用附加函数进行嵌套,每次函数调用时返回的数组从前一个函数。我使用此代码为 BootStrap 中的数组添加值:

$SharedManager->attach('Identifier', 'onChangeArray', function($e) {
     $values = $e->getParam('values');
     $values[] = 4 ;
     return $values;
});

如果可能,请帮助我从数组中删除。

4

1 回答 1

1

好的,我想我现在明白了。不要像在循环中那样从结果集合中获取返回值,而是for创建一个包含这些值的事件对象,并让您的侦听器改为对该数组进行操作。

$input = array(1,2,3);
$event = new \Zend\EventManager\Event('onChangeArray', $this, array('values' => $input));
$EventManager->trigger($event);

$values = $event->getParam('values');

因为事件是通过引用传递的,你的监听器不需要返回任何东西,他们只需要对values参数进行操作。考虑以下两个侦听器,一个从数组中添加,一个从数组中删除。都不直接返回值,它们都作用于给定的values参数中包含的参数$event

$SharedManager->attach('Identifier', 'onChangeArray', function($e) {
    $values = $e->getParam('values');
    // add value 4 to array
    $values[] = 4 ;
    $e->setParam('values', $values);
});

$SharedManager->attach('Identifier', 'onChangeArray', function($e) {
    $values = $e->getParam('values');
    // remove value of 3 from array
    if (($key = array_search(3, $values)) !== false) {
        unset($values[$key]);
    }
    $e->setParam('values', $values);
});

按照第一步的指示触发事件后,您会发现values事件中的参数包含最终数组...

// ..
$EventManager->trigger($event);
$values = $event->getParam('values');

\Zend\Debug\Debug::dump($values);
// result
array(3) {
    [0] => int(1)
    [1] => int(2)
    [3] => int(4)
}
于 2013-06-01T16:36:15.350 回答