使用回调函数处理数组的函数

时间:2022-09-21 05:35:02

函数的回调是PHP中的一种特殊机制,这种机制允许在函数的参数列表中,传入用户自定义的函数地址作为参数处理或完成一定的操作。使用回调函数可以很容易地显示一些所需的功能。以下将介绍主要的几个使用回调函数处理数组的函数。

①函数array_filter()
array_filter函数用回调函数过滤数组中的元素,返回按用户自定义函数过滤后的新数组。该函数有两个参数,其函数的原型如下:

array array_filter(array input [,callback callback])

该函数的第一个参数是必选项,要求输入一个被过滤的数组。第二个参数是可选项,将用户自定义的函数名以字符串形式传入。如果自定义过滤函数返回true,则被操作的数组的当前值就被包含在返回的数组中,并将结果组成一个新的数组。如果原数组是一个关联数组,则键名保持不变。函数array_filter()使用的代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//自定义函数myFun,为数组过滤设置条件
function myFun( $var ){
if ( $var % 2 ==0)
return true;
}
 
//声明值为整数序列的数组
$array = array ( "a" =>1, "b" =>2, "c" =>3, "d" =>4, "e" =>5);
 
//使用函数array_filter()将定义的函数名以字符串的形式传给第二个参数
print_r( array_filter ( $array , "myfun" ));
 
//过滤后的结果输出 Array([b]=>2 [d]=>4)
?>

在上面的代码中,array_filter()函数一次将 $array数组中的每个值传递到myFun()函数中,如果myFun()函数返回TRUE,则$array数组的当前值会被包含在返回的结果数组中,并将结果组成一个新的数组返回。

②函数array_walk()

array_walk()函数对数组中的每个元素应用回调函数处理。如果成功则返回TRUE,否则返回FALSE。其函数的原型如下:

bool array_walk(array $array,callback funcname[,mixed userdata])

该函数的第一个参数是必选项,要求输入一个被指定的回调函数处理的数组。第二个参数也是必选项传入用户定义的回调函数,用于操作传入第一个参数的数组。array_walk()函数一次将第一个参数的数组中的每个值传递到这个自定义的函数中。自定义的这个回调函数中应该接收两个参数,依次传入进来的元素的值作为第一个参数,键名作为第二个参数。在array_walk()函数中提供可选的第三个参数,也将被作为回调函数的第三个参数接收。

如果自定义的回调函数需要的参数比给出的多,则每次array_walk()调用回调函数时都会产生一个E_WARNING级的错误。这些警告可以通过在array_walk()调用前加上PHP的错误操作符@来抑制,或者用error_reporting()。

如果回调函数需要直接作用于数组中的值,可以将回调函数第一个参数指定为引用:&$value。函数array_walk()使用的代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
//定义一个可以作为回调的函数,名称为myfun1
function myfun1( $value , $key ) {
echo "The key $key has the value $value<br>" ;
}
 
//定义一个数组$lamp
$lamp = array ( "a" => "Linux" , "b" => "Apache" , "c" => "MySQL" , "d" => "PHP" );
//使用array_walk()函数传入一个数组和一个回调函数
array_walk ( $lamp , "myfun1" );
 
/*执行后的输出如下结果:
The key $key has the value Linux
The key $key has the value Apache
The key $key has the value MySQL
The key $key has the value PHP
*/
 
//定义一个可以作为回调的函数,名称为myfun2
function myfun2( $value , $key , $p ){
echo "$key $p $value <br>" ;
}
 
//使用array_walk函数传入三个参数
array_walk ( $lamp , "myfun2" , "has the value" )
 
/*执行后输出如下结果:
a has the value Linux
b has the value Apache
c has the value MySQL
d has the value PHP
*/
 
//定义一个可以作为回调的函数,名称为myfun3,改变数组元素的值
 
function myfun3(& $value , $key ){
$value = "web" //将改变原数组中每个元素的值
}
 
//使用array_walk()函数传入两个参数,其中第一个参数为引用
array_walk ( $lamp , "myfun3" );
 
print_r( $lamp ); //输出:array([a]=>Web [b]=>Web [c]=>Web [d]=>Web)
?>

③函数array_map()

与上一个array_walk()函数相比,array_map()函数将更加灵活,并且可以处理多个数组。将回调函数作用到给定数组的元素上,返回用户自定义函数作用后的数组。array_map()是任意参数列表函数,回调函数接收的参数数目应该和传递给array_map()函数的数组数目一直。其函数原型如下:

array array_map(callback callback ,array arr1[,array...])

该函数中第一个参数是必选项,是用户自定义回调函数的名称,或者是null。第二个参数也是必选项,输入要处理的数组。也可以接着输入多个数组作为可选参数。函数array_map()使用的代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
//自定义一个函数作为回调函数,函数名称为myfun1
function myfun1( $v ) {
if ( $v === "MySQL" ){         //如果数组中元素的值等于MySQL条件成立
return "Oracle" ;       //返回Oracle
}
return $v ;       //不等于MySQL的元素都返回传入的值
}
 
//声明一个有4个元素的数组$lamp
$lamp = array ( "Linux" , "Apache" , "MySQL" , "PHP" );
 
//使用array_map()函数传入一个函数名和一个数组参数
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" ;
}
return "different" ;
}
 
$a1 = array ( "Linux" , "PHP" , "MySQL" );      //声明数组$a1,有三个元素
$a2 = array ( "Unix" , "PHP" , "Oracle" );
 
print_r( array_map ( "myfun2" , $a1 , $a2 ));        //使用array()函数传入多个数组
 
//上面程序执行后输出:Array ( [0] => different [1] => same [2] => different )
 
//当自定义函数名设置为null时的情况
$a1 = array ( "Linux" , "Apache" );
$a2 = array ( "MySQL" , "PHP" );
 
print_r( array_map (null, $a1 , $a2 ));
//上面程序执行后输出:array([0]=>Array([0]=>Linux [1]=>MySQL) [1]=>array([0]=>Apache [1]=>PHP))
?>

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