2

如下所示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()工作?

4

4 回答 4

4

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

但是,当函数参数被指定为&..(如通过引用传递中所讨论的)时,语义将切换到按引用调用。这意味着调用者中的变量可以通过重新分配参数来改变。在这种情况下,对局部参数的赋值通过引用语义和代码“工作”重新分配当前迭代的数组元素。

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

于 2013-10-30T19:30:03.693 回答
3

随着function($a)您将副本传递$a给函数。

随着function(&$a)您传递对该函数的引用。$a这样您就可以$a从函数内部进行更改。

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

相关问题:array_map、array_walk 和 array_filter 之间的区别

于 2013-10-30T19:25:45.447 回答
2

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

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

于 2013-10-30T19:24:08.033 回答
0

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

于 2013-10-30T19:24:36.910 回答