如何在PHP中使用带闭包的外部变量?

时间:2014-05-05 01:46:46

标签: php closures

我正在试图弄清楚如何在我的闭包中使用外部变量

function times2(Array $arr, Closure $callback) {
  foreach ($arr as $n) {
    $callback($n * 2);
  }
}

$foo = array(1,2,3);
$ret = array();

times2($foo, function($n) use($ret) {
  printf("should be adding %d to the array\n", $n);
  array_push($ret, $n);
});

print_r($ret);

输出

should be adding 2 to the array
should be adding 4 to the array
should be adding 6 to the array
Array
(
)

我希望

should be adding 2 to the array
should be adding 4 to the array
should be adding 6 to the array
Array
(
  [0] => 2,
  [1] => 4,
  [2] => 6
)

但我的$ret数组是空的!


PS 我知道可以使用array_maparray_walk完成此操作。我只想弄清楚如何使用Closure。

2 个答案:

答案 0 :(得分:2)

你需要引用$ret而不是复制它。只需在匿名函数中的变量名前添加&

times2($foo, function($n) use(&$ret) {
  printf("should be adding %d to the array\n", $n);
  array_push($ret, $n);
});

答案 1 :(得分:-2)

很抱歉给出了错误的答案(这里的新内容)。我知道你已经选择了一个正确的答案,但我认为无论如何我都要纠正错误。我使用全局变量测试了下面的代码,它可以按照您的要求运行。谢谢你给我你的反馈。

function times2(Array $arr, Closure $callback) {

  foreach ($arr as $n) {
    $callback($n * 2);
  }
}

$foo = array(1,2,3);
$ret = array();

times2($foo, function($n) use($ret) {

  global $ret;
  $ret[] = $n;
  echo "should be adding $n to the array</ br>";

});

print_r($ret);