array_map(function($v){ // }, $array); array_walk($array, function($v, $k){ // }); array_filter($array, function($v){ // });
以上三者 array_map、array_walk、array_filter
相同点:都是利用回调函数对数组中每个元素进行操作。
不同点:
- 返回值
- 回调函数的参数
- 是否改变数组的值
array_map 返回的是新数组,原数组不变(新数组和原数组的数组长度应该一样)。
array_walk 返回的布尔值,如果要改变数组元素的值,回调函数第一个参数必须是引用,如 array_walk($array, function(&$v, $k){}); , arrary_walk 的回调函数还能够接收数组的key。
array_filter 返回的是新数组,原数组不变。它的作用是过滤数组中的元素。回调函数返回真,元素才能保存到新数组中,即(新数组和原数组的数组长度可能不一样)
下面是个例子
1 echo "<pre>"; 2 testArrayCallBack(); 3 function testArrayCallBack(){ 4 $arr = array(12,64,3,47); 5 6 //array_map返回的新数组,原数组不变 7 $newArr = array_map(function($v){ 8 return ++$v; 9 },$arr); 10 echo "原数组:<br/>"; print_r($arr); 11 echo "array_map 返回的新数组:<br/>"; print_r($newArr); 12 13 //array_walk返回布尔值,原数组改变 14 $b = array_walk($arr, function(&$v, $k){ //如果想回调函数能直接改变数组的值,那么回调函数地址参数应为引用。 15 $v+=$k; 16 }); 17 echo "原数组:<br/>"; print_r($arr); 18 echo "array_walk 返回的布尔值:"; var_dump($b ); 19 20 //array_filter返回新数组,原数组不变 21 $newArr = array_filter($arr, function($v){ 22 return $v > 10; 23 }); 24 echo "原数组:<br/>"; print_r($arr); 25 echo "array_filter返回的新数组:<br/>"; print_r($newArr); 26 }
执行结果:
原数组: Array ( [0] => 12 [1] => 64 [2] => 3 [3] => 47 ) array_map 返回的新数组: Array ( [0] => 13 [1] => 65 [2] => 4 [3] => 48 ) 原数组: Array ( [0] => 12 [1] => 65 [2] => 5 [3] => 50 ) array_walk 返回的布尔值:bool(true) 原数组: Array ( [0] => 12 [1] => 65 [2] => 5 [3] => 50 ) array_filter返回的新数组: Array ( [0] => 12 [1] => 65 [3] => 50 )
总结:
array_map 对参数数组的每个元素进行操作,返回新数组,不改变原数组的值
array_walk 对参数数组的每个元素进行操作,返回布尔,改变原数组的值。
array_filter 对参数数组的元素进行过滤,返回新数组,不改变原数组的值。