Home » Code » php数组函数array_walk()

php数组函数array_walk()

昨天写了array_map(),不可避免的必须也说一下array_walk(),因为它们两看上去实在太像了,它俩到底有何区别?还有就是array_map看着还有点用,array_walk实在难看得出到底有什么用。好吧,先看手册上写的:

array_walk — 对数组中的每个成员应用用户函数。bool array_walk ( array &$array , callback $funcname [, mixed $userdata ] )。

array_walk会把数组的值作为第一参数、键作为第二参数传给回调函数,所以一般情况下回调函数应该定义两个参数。如果定义了userdata,则将之作为第三参数传给回调函数,这时回调函数就应该定义三个参数。

假设以下情况,我们得到一个以姓名为键,成绩为值的一维数组:
$grades = array(
'xiaoming' => 34,
'xiaodong' => 56,
'xiaoqiang' => 20,
);

需要对之处理一番,得到一个二维数组,每个元素是一个包含用户姓名、成绩和是否通过的一维数组,这是否通过是通过对成绩进行一番判断处理得到的结果,简单点就给加上20分看够不够60吧。我们可以定义一个myfunc函数接收以上数组的键和值以及要加上的分数,经过处理后存到$newGrades数组内。
$newGrades = array();
function myfunc($value, $key, $userdata) {
GLOBAL $newGrades;
$data['name'] = $key;
$data['grade'] = $value;
$value = $value + $userdata;//加上自定义的值20,还不过没办法了
if($value < 60) {
echo $key, '-', $value, '-重修';
$data['result'] = '重修';
}else{
echo $key, '-', $value, '-通过';
$data['result'] = '通过';
}
$newGrades[] = $data;
}
$result = array_walk($grades, 'myfunc', 20);
var_dump($result);
print_r($grades);
print_r($newGrades);

以上程序很简单,array_walk将数组$grades中的值和键以及20按顺序传给myfunc处理,myfunc每执行一次就把本次处理的结果存到全局数组$newGrades中。myfunc执行输出的结果是加了20分后的成绩,以及根据加了后的成绩判断是否通过的结果:
xiaoming-54-重修
xiaodong-76-通过
xiaoqiang-40-重修

var_dump($result)是array_walk执行是否成功,成功布尔值true,失败为false;这里为true。

print_r($grades),是打印原数组,这里只是把原数组的键值作为参数使用了,整个过程没有对原数组进行任何改动。
Array
(
[xiaoming] => 34
[xiaodong] => 56
[xiaoqiang] => 20
)

当然,如果要改动在myfunc中将参数设置为引用即可,第一第二参数都可以设置,这样在函数中对键值的改变也会影响原数组中的键值。上边如果把第一参数设为&$value,原数组结果就是各加了20分。

print_r($newGrades)就是我们想要的结果,结果如下:

Array
(
[0] => Array
(
[name] => xiaoming
[grade] => 34
[result] => 重修
)
[1] => Array
(
[name] => xiaodong
[grade] => 56
[result] => 通过
)
[2] => Array
(
[name] => xiaoqiang
[grade] => 20
[result] => 重修
)
)

从以上可以看到,array_walk返回的结果并不是重点,重点是处理的过程,处理的过程为我们创造了需要的其他东西。而array_map重点是结果,最终返回结果是我们需要的东西。array_walk是把键和值以及一个第三参数同时交给回调函数处理,而array_map只把值交给回调函数处理。array_map可以同时把多个数组交给回调函数处理,array_walk只可以把一个数组交给回调函数处理。

有什么区别应该解释得很清楚了,有什么用,应该也看到了,就是用它能把数组键值对依次传给回调函数处理的特性,在回调函数中创造我们需要的东西!

其实array_map和array_walk一定程度上来说都可以用foreach来代替,但,不觉得foreach屌丝气质浓重么?不说什么逼格,既然有这么个高大上的函数,为何不拿来用呢。

以上纯属个人总结加瞎掰,有不对的地方,欢迎批评指正!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.