PHP使用回调函数处理数组array_filter,array_walk,arra

zxh5566  2016-07-25 20:16   Hits: 

函数的回调是PHP中一种特殊机制,这种机制允许在函数的参数列表中,传入用户自己定义的函数地址作为参数处理或完成一定的操作,使用回调函数可以很容易实现一些所需要的功能

1、array_filter()
array_filter()函数用回调函数过滤数组中的元素,返回按用户自定义函数过滤后的新数组,该函数有两个参数,其函数的第一个参数是必选项,要求输入一个被过滤的数组,第二个参数是可选项,将用户自定义的函数名以字符串形式传入,如果自定义过滤函数返回true,则被操作的数组的当前值就会被包含在返回的结果中,并将结果组成一个新的数组。如果原数组是一个关联数组,键名保持不变
<?php
function myFun($var){
if($var % 2 ==0){
return true;
}
$arr = array('a'=>1,'b'=>2,'c'=>3,'d'=>4);
print_r($arr,'myFun'); //过滤结果Array([b]=>2 [d]=>4);
}
在上面代码中,array_filter()依次将$arr数组中的每个值都传递到myFun()函数中,如果myFun()返回true;则$arr数组当前值会被包含在返回的结果数组中,并将结果组成一个新的数组返回。

2、array_walk()
array_walk()函数对数组中的每个元素应用回调函数处理,如果成功返回true,否则返回false,该函数有三个参数,第一个参数是必选项,要求输入一个被指定的回调函数处理的数组,第二个参数是必选项,传入用户定义的回调函数,用于操作传入第一个参数的数组,array_walk()依次将第一个参数的数组中的每个值传递到这个自定义的函数中,自定义的这个回调函数中应该接收两个参数,依次传入进来的元素值作为第一个参数,键名作为第二个参数,如果array_walk()提供第三个参数,也将作为回调函数的第三个参数接收
如果自定义的回调函数需要的参数比给出的多,则每次array_walk()调用回调函数时都会产生一个E_WARNING错误,这些警告可以通过在array_walk()调用前加上PHP的错误操作符@来抑制,或者用error_reporting()
如果回调函数需要直接作用于数组,可以将回调函数第一个参数指定为引用
<?php
function myFun1($v,$k){
echo "the key $k has the value $v";

$lamp = array('a'=>'Linux','b'=>'Apache','c'=>'MySQL','d'=>'PHP');
array_walk($lamp,'myFun1');

function myFun3(&$v,$k){
$v = "web";
array_walk($lamp,'myFun3');
print_r($lamp); //输出Array([a]=>web [b]=>web) [c]=>web [d]=>web)
}
}

3、array_map()

array_map()更加灵活,并且可以处理多个数组,将回调函数作用到给定数组的值上,返回用户自定义函数作用后的数组,array_map()是任意参数列表函数,回调函数接受的参数数目应该和传递给array_map函数数目一致。该函数第一个参数是必选项,是用户自定义的回调函数的名称,或者是null,第二个参数也是必选项,输入要处理的数组,也可以接着输入多个数组作为可选参数,函数array_map()使用的代码如下

<?php
function myFun1($v){
if($v=='mysql'){
return 'oracle';
}else{
return $v;
}
}

$lamp = array('linux','apache','mysql','php');
print_r(array_map('myFun1',$lamp)); //输出Array([0]=>linux [1]=>apache [2]=>oracle [3]=>php)

//使用多个参数,回调函数接受的参数数目应该和传递给array_map()的数组数目一致

function myFun2($v1,$v2){
if($v1==$v2){return 'same';}
else{return 'diff';}
}
$a1=array('linux','apache','mysql','php');
$a2=array('unix','apache','mysql','php');
print_r(array_map('myFun2',$a1,$a2)); //Array([0]=>diff [1]=>same [2]=>same [3]=>same)

//当自定义函数名设置为null
$a1=array('linux','apache');
$a2=array('mysql','php');
print_r(array_map(null,$a1,$a2));//Array([0]=>array([0]=>linux [1]=>apache)
                                        [1]=>array([0]=>mysql [1]=>php))
}

通常array_map()使用了两个或更多数组时,它们的长度应该相等,因为回调函数是平行作用于相应的单元上的,如果数组的长度不同,则最短的一个将被用空的单元扩充

上一篇:php数组的相关处理函数
下一篇:PHP数组的排序函数 sort() asort() ksort()