【问题标题】:Why is array_walk with anonymous function providing different result than foreach?为什么带有匿名函数的 array_walk 提供的结果与 foreach 不同?
【发布时间】:2012-09-27 00:00:43
【问题描述】:

PHP 版本 5.3.2-1ubuntu4.15

1、起始值:

$value_array = array('0.000','2.530',8);
$op_value = 2;

试试这个:

            foreach($value_array as &$source_value) {
                $source_value = $source_value + $op_value;
            }

并得到 $value_array == (2,4.53,10);

但是如果你运行这个:

            array_walk($value_array,function(&$source_value) {
                $source_value = $source_value + $op_value;
            });

你得到 $value_array == (0,2.53,8);

第一个给出了预期的结果,第二个没有。但它确实做了一些事情。多余的 0 最终被砍掉了。

这是为什么?我想使用 array_walk,但现在必须使用 foreach。

【问题讨论】:

  • $op_value 来自哪里? - 在回调中不可用。
  • 这一定是答案。我必须将它作为第二个参数添加到array_walk,不是吗?哎呀。
  • 不是array_walk 的第二个参数,而是function() 的参数之一 - 或者使用@Barmar 提到的use
  • ubuntu 4.15?是时候更新了? ;)
  • @JordanArseno - 这不是 php 版本字符串中的操作系统版本,这是 PHP 的 ubuntu 特定版本

标签: php


【解决方案1】:

您也可以使用array_walk 的第三个参数指定extra parameter 传递给回调函数。

array_walk($value_array, function(&$source_value, $key, $extra_param) { // <--- (2) and use here
    $source_value = $source_value + $extra_param;
}, $op_value); // <--- (1) pass it here

【讨论】:

    【解决方案2】:

    您可以使用use 声明来访问外部变量:

            array_walk($value_array,function(&$source_value) use ($op_value) {
                $source_value = $source_value + $op_value;
            });
    

    或者如果它是全局的,你可以这样做:

            array_walk($value_array,function(&$source_value) {
                global $op_value;
                $source_value = $source_value + $op_value;
            });
    

    【讨论】:

    • 这段代码在类方法中。 $op_value 也在其中。 global 还能用吗?
    • 不,global 仅适用于全局变量。对于必须在闭包中捕获的局部变量,您必须使用use
    • 谢谢,很高兴您介绍了 2 个解决方案。
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多