3.10.2 对数组的每一个元素应用任何函数:array_walk()

有时候,读者可能希望以相同方式使用或者修改数组中的每一个元素。array_walk()函数允许进行这样的操作。函数array_walk()的原型如下所示:


bool array_walk(array arr,string func,[mixed userdata])


其调用方法类似于前面所介绍的usort()函数的调用,array_walk()函数要求声明一个你自己的函数。正如你所看到的,array_walk()函数需要三个参数。第一个是arr,也就是需要处理的数组。第二个是func,也就是用户自定义并将作用于数组中每个元素的函数。

第三个参数userdata是可选的,如果使用它,它可以作为一个参数传递给我们自己的函数。

在接下来的内容,读者将了解这个函数是如何工作的。

这个用户自定义函数可以是一个以指定格式显示各个元素的函数。如下所示的代码通过在$array数组的每个元素中调用用户自定义的my_print()函数,从而将每个元素显示在一个新行中:


function my_print($value){

echo"$value<br/>”;

}

array_walk($array,'my_print');


以上所编写的这个函数还需要有特定的符号。对于数组中的每个元素,array_walk将以关键字和保存在数组中的值为参数,此外,还可以以任何数据作为该函数的userdata参数。可以按如下方式调用函数:


yourfunction(value,key,userdata)


在大多数情况下,函数只能处理数组中的值。但是,在某些情况下,可能还需要使用userdata参数向函数传递一个参数。在少数情况下,可能还需要对数组关键字和值进行处理。在MyPrint()函数中,可以忽略关键字参数和userdata参数。

在一个稍微复杂点的例子中,将编写一个带有一个参数的函数,这个函数可以用来修改数组的值。请注意,虽然对关键字并不感兴趣,但为了接收第三个参数变量,还是必须接收它:


function my_multiply(&$value,$key,$factor){

$value*=$factor;

}

array_walk(&$array,'my_multiply',3);


在这里,定义了一个名为my_multiply()的函数,它可以用所提供的乘法因子去乘以数组中的每个元素。需要使用array_walk()函数的第三个参数来传递这个乘法因子。因为需要这个参数,所以在定义my_multiply()函数时必须带有三个参数——一个数组元素值($value)、一个数组元素的关键字($key)和参数($factor)。可以选择忽略这个关键字。

此外,还有一个需要注意的问题是传递参数$value的方式。在my_multiply()的函数定义中,变量前面的地址符(&)意味着$value是按引用方式传递的。按引用方式传递允许函数修改数组的内容。

我们将在第5章中详细介绍按引用方式的传递。如果你对这个术语还不太熟悉,那么现在就只需知道:为了使用引用传递,这里在变量名称前面加了一个地址符。