array_map、array_walk、array_reduce
不同情境下替换foreach,且效果更佳
array_map(),仅遍历值,返回操作后新数组,支持多个数组。
array_reduce(),仅遍历值,返回累积操作后最后一个return的值。
array_walk(),遍历键值对,返回Bool值,可以通过use(¶m)传递额外的参数或直接修改原数组。
array_map
对原数组的值进行遍历,array_map()参数中有几个数组,自定义函数就接收几个参数,
返回值:自定义函数return的值组成的新数组
public function test($request) { $aa = array('aa', 'bb'); $bb = array_map(function($item) { $item = $item . 'aa' ; return $item; }, $aa); var_dump($aa); echo'<br/>'; var_dump($bb); } //结果 array(2) { [0]=> string(2) "aa" [1]=> string(2) "bb" } array(2) { [0]=> string(4) "aaaa" [1]=> string(4) "bbaa" } //只对数组的值进行操作并返回一个新数组时,可以把array_map当成foreach的普通遍历使用。 //array_map()参数里有几个数组,自定义函数就必须有几个参数来承接值。 function myfunction($v1,$v2) { if ($v1===$v2) { return "same"; } return "different"; } $a1=array("Horse","Dog","Cat"); $a2=array("Cow","Dog","Rat"); print_r(array_map("myfunction",$a1,$a2));
array_reduce
仅遍历数据的值,将结果作为v1和下一个值作为v2通过自定义方法计算后返回。用于叠加值、或拼接等情况,最终返回的是最后一次自定义函数的return值
function myfunction($v1,$v2) { return $v1 . "-" . $v2; } $a=array("Dog","Cat","Horse"); $res = array_reduce($a,"myfunction",5)//第三个参数可选:规定发送到函数处理的第一个值 print_r($res); //5-Dog-Cat-Horse
array_walk
【array_walk_recursive 更深的数组】
对数组中的每个元素应用用户自定义函数【数组的键名和键值是参数】。
实际遍历每个键值对key和val,最终返回一个bool值。
array_walk()更像是普通遍历,,我习惯用它来替换foreach,可以用use(&sum)传递额外的参数,如何使用见代码
//把数组内值等于99的设置为- function test() { $val = [11,22,99,99,33,44]; $sum = 0; array_walk($val, function ($v,$k) use(&$val,&$sum){ if($v == 99) { $val[$k] = '-'; } $sum += $v; }); var_dump($val);//结果array(11, 22, "-", "-", 33, 44); var_dump($sum);exit; //int(308) }
知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。
所谓诚其意者,毋自欺也。