array_map,array_walk,array_walk_recursive三个函数,array_walk_recursive比较明显,可以认为是array_walk函数的升级版,它会递归地处理数组中的元素,先放一边。对比一下array_map和array_walk,从功能上看array_map和array_walk都是使用回调函数对数组单元进行处理,array_map详解如下:本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
array_map 将回调函数作用到给定数组的单元上
使用格式:array array_map ( callable $callback , array $arr1 [, array $... ] )
array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。callback接受的参数数目应该和传递给 array_map() 函数的数组数目一致。本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
#取得一个data数组,键值显示如下: $json = '{"226495":"2018-12-25 10:47:47","226519":"2018-12-25 10:47:45","226499":"2018-12-25 10:47:44","226604":"2019-01-11 11:21:51","226517":"2018-12-25 10:47:36","226630":"2019-01-11 11:17:56","226493":"2018-12-25 10:47:34","226502":"2018-12-25 10:47:32"}'; $data = json_decode($json, true); print_r($data); $dates = array_values($data); #自定义函数只传递一个参数, function test1($val){ return explode(' ', $val)[1]; } function test2($val, $val2){ return current(explode(' ', $val)); } function test3($val, $val2){ return explode(' ', $val)[1].'=='.$val2; } #调用array_map对单个数组值进行处理,索引能保持 print_r(array_map('test1', $data)); #传递多个数组后返回的数组键名重新进行数字索引 print_r(array_map('test2', $data, $dates)); #传递多个数组进行数据重组处理 print_r(array_map('test3', $data, $dates)); #页面显示如下: Array ( [226495] => 2018-12-25 10:47:47 [226519] => 2018-12-25 10:47:45 [226499] => 2018-12-25 10:47:44 [226604] => 2019-01-11 11:21:51 [226517] => 2018-12-25 10:47:36 [226630] => 2019-01-11 11:17:56 [226493] => 2018-12-25 10:47:34 [226502] => 2018-12-25 10:47:32 ) Array ( [226495] => 10:47:47 [226519] => 10:47:45 [226499] => 10:47:44 [226604] => 11:21:51 [226517] => 10:47:36 [226630] => 11:17:56 [226493] => 10:47:34 [226502] => 10:47:32 ) Array ( [0] => 2018-12-25 [1] => 2018-12-25 [2] => 2018-12-25 [3] => 2019-01-11 [4] => 2018-12-25 [5] => 2019-01-11 [6] => 2018-12-25 [7] => 2018-12-25 ) Array ( [0] => 10:47:47==2018-12-25 10:47:47 [1] => 10:47:45==2018-12-25 10:47:45 [2] => 10:47:44==2018-12-25 10:47:44 [3] => 11:21:51==2019-01-11 11:21:51 [4] => 10:47:36==2018-12-25 10:47:36 [5] => 11:17:56==2019-01-11 11:17:56 [6] => 10:47:34==2018-12-25 10:47:34 [7] => 10:47:32==2018-12-25 10:47:32 )使用过程中发现:array_map有如下特点:
1,array_map在调用的方法中取不到数组的键名,特别是只传递一个数组的时候,它完全是处理值。
2,只传递一个数组给array_map最后得到的数组键名不变,但是如果传递多个数组则键名全都自动变成重新排列的数字索引。
3,回调函数是平行作用于相应的单元上的, 所以使用多个数组时,它们的长度应该相同。不然则最短的一个将被用空的单元扩充。
总结:array_map的主要作用是通过自定义函数对数组的值进行另外处理,另外可以做为对多个数组的相对应单元进行数据合并处理等。本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
另外,看到array_map函数一个很有趣的用法,也许我们在开发的时候有时也遇到过,但是不知道这个能实现,或许走了些弯路。array_map可以很容易的通过用NULL作为回调函数名来构造一个数组的数组。如下array_map实现三个维度的数据的合并代码:本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
#三个维度的数据合并 $names = array('zhangsan', 'lisi', 'wangwu'); $sex = array("man", "sex", "man"); $age = array(20, 25, 28); $users = array_map(null, $names, $sex, $age); print_r($users); #输出结果如下: Array ( [0] => Array ( [0] => zhangsan [1] => 20 [2] => man ) [1] => Array ( [0] => lisi [1] => 25 [2] => sex ) [2] => Array ( [0] => wangwu [1] => 28 [2] => man ) )array_walk 使用用户自定义函数对数组中的每个元素做回调处理
使用格式:bool array_walk ( array &$array , callable $funcname [, mixed $userdata = NULL ] )
array_walk() 将用户自定义函数 funcname 应用到 array 数组中的每个单元。 成功时返回 TRUE, 或者在失败时返回 FALSE。本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
array_walk()使用示例如下:本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
#不修改原数组,直接显示 function walk1($value, $key){ echo '第',$key,'名:',$value,'<br>';} #地址引用,直接修改 function walk2(&$value, $key){ $value = '第'.$key.'名:'.$value;} #地址引用,直接修改, 附带其它数据 function walk3(&$value, $key, $more){ $value = $more .$value;} $names = array(1=>'zhangsan',2=> 'lisi',3=> 'wangwu'); $result = array_walk($names, 'walk1'); var_dump($result); echo '------------------<br>'; $result2 = array_walk($names, 'walk2'); print_r($names); var_dump($result2); echo '------------------<br>'; $result3 = array_walk($names, 'walk3', '大家好, '); print_r($names); var_dump($result3); #页面显示结果: 第1名:zhangsan 第2名:lisi 第3名:wangwu bool(true) ------------------ Array ( [1] => 第1名:zhangsan [2] => 第2名:lisi [3] => 第3名:wangwu ) bool(true) ------------------ Array ( [1] => 大家好, 第1名:zhangsan [2] => 大家好, 第2名:lisi [3] => 大家好, 第3名:wangwu ) bool(true)使用中发现:array_walk有如下特点:
1, array_walk同时能拿到数据的键和值
2,array_walk并不返回新数组,只返回标识操作是否成功的布尔值
3,因为array_walk不返回数组,array_walk的使用更倾向于在原数组上进行数据修改处理,当然也可以在另外一个变量上处理。本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
通过上面对array_map和array_walk的使用,综合起来对比区别如下:
1,array_walk主要是针对单个数组进行处理,array_map可以处理单个,也可以把多个数组结合一起处理。
2,array_map的作用更多的是得到一个新数组,array_walk更多的是想做一些job, 只要结果执行成功了即行。
3,对单个数组进行操作时,array_map和array_walk功能很像,区别在于array_map是取得返回的数组;而array_walk因为不返回所以通过地址引用在原数组上修改以实现“返回”。
4,对多个数组处理时array_map比array_walk更适合。本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
最后关于:array_walk_recursive
array_walk_recursive 对数组中的每个成员递归地应用用户函数
bool array_walk_recursive ( array &$input , callable $funcname [, mixed $userdata = NULL ] )
将用户自定义函数 funcname 应用到 array 数组中的每个单元。与array_walk不同的是,array_walk_recursive函数会递归到更深层的数组中去,即对多维数组,array_walk_recursive会深入到更深层的数组键值中去处理。有一点需要要特别注意的是传入给array_walk_recursive的数组参数中任何值为 array 的键都不会被传递到回调函数中去。本文地址:http://www.04007.cn/article/600.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/600.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |