为什么array_walk()没有按预期工作?

时间:2013-10-30 19:21:24

标签: php arrays

以下code does not work按预期方式。

$fruits = array('apple', 'orange', 'banana', 'cherry');

array_walk($fruits, function($a) {
        $a= ucfirst($a);
});

var_dump($fruits);

当我们将引用传递给$fruits数组中的单个条目时,为什么会这样做。

array_walk(
    $fruits, 
    function(&$a) {
        $a = ucfirst($a);
    }
);

注意:我知道array_mapforeach可行,但为什么array_walk()不起作用?

4 个答案:

答案 0 :(得分:3)

通常,PHP在评估函数时使用Call by Value语义。这意味着重新分配参数将影响调用者中的变量绑定。因此,“非工作”代码中的赋值在回调之外没有任何影响,因此不会改变遍历数组。

但是,当函数参数指定为&.. (as discussed in Passing By Reference)时,语义将切换为Call by Reference。这意味着可以通过重新分配参数来更改调用者中的变量。在这种情况下,本地参数的赋值通过Call by Reference语义重新分配当前迭代的数组元素,代码“工作”。

现在,array_walk“以这种方式工作”,因为它是设计以使用Call by Reference语义。另一方面,array_map使用回调的返回值。

答案 1 :(得分:2)

  

如果回调需要使用数组的实际值,   指定回调的第一个参数作为参考。

根据文档:http://php.net/array_walk

答案 2 :(得分:2)

通过function($a)$a副本传递给该函数。

使用function(&$a)引用传递给$a到该函数。这样您就可以在函数中更改$a

这就是为什么array_walkarray_map具有更高的内存效率;您不需要额外的变量,将函数应用于原始元素而不是返回新更改的数组。

相关问题:Difference between array_map, array_walk and array_filter

答案 3 :(得分:0)

在第一个示例中,$a是局部变量。功能之外的所有更改都将丢失。 顺便说一句,参考指向真实数组并更改它但不是本地副本。