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 對參數數組的元素進行過濾,返回新數組,不改變原數組的值。