以下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_map
和foreach
可行,但为什么array_walk()
不起作用?
答案 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)
如果回调需要使用数组的实际值, 指定回调的第一个参数作为参考。
答案 2 :(得分:2)
通过function($a)
将$a
的副本传递给该函数。
使用function(&$a)
将引用传递给$a
到该函数。这样您就可以在函数中更改$a
。
这就是为什么array_walk
比array_map
具有更高的内存效率;您不需要额外的变量,将函数应用于原始元素而不是返回新更改的数组。
相关问题:Difference between array_map, array_walk and array_filter
答案 3 :(得分:0)
在第一个示例中,$a
是局部变量。功能之外的所有更改都将丢失。
顺便说一句,参考指向真实数组并更改它但不是本地副本。