1 区别

  • array_map 有Array返回值

    1、array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后新的数组,若函数作用后无返回值,则对应的新数组中为空。
    2、回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
    3、提示:您可以向函数输入一个或者多个数组。

    若相函数输入2个数组,其函数接受参数也应该有两个,map给函数传值时,是每次从两个数组中分别取一个传给函数。即多个数组之间是同步提交的,不是提交完一个数组再提交下一个提交几个数组,则函数也需要有几个参数

    语法:

    1
    function array_map(?callable $callback, array $array, array ...$arrays): array {}
    • 结果导向:通过回调函数对当前数组A的值进行处理,之后将被处理的值放到一个新的数组B中,并返回数组B,原数组A不变。
    • 返回值是经过回调函数处理之后生成的新数组
    • 回调函数有几个形参,则array_map就要传几个数组给回调函数
    • 回调函数基础形参只是Array的值,不包含键
  • array_walk 有Boolean返回值

    使用用户自定义函数对数组中的每个元素做回调处理

    注意:

    如果 $funcname 需要直接作用于数组中的值,则给 funcname 的第一个参数指定为引用(添加&符号)。这样任何对这些单元的改变也将会改变原始数组本身。

    语法:

    1
    function array_walk(object|array &$array, callable $callback, mixed $arg): bool {}
    • 过程导向:通过回调函数对当前数组A的值进行处理,处理的结果可以通过引用(&)来改变数组A,如果没有引用,则数组A不变。
    • 返回值只表示回调函数是否调用成功
    • 可以自定义非Array额外参数给回调函数
    • 回调函数基础形参是Array的键值对,可额外传参

2 举例

2.1 array_map

1
2
3
4
5
6
7
8
9
10
11
12
13
$b = [
['name' => 'zz', 'age' => 12],
['name' => 'ls', 'age' => 13],
['name' => 'hh', 'age' => 8]
];

$c = array_map(function ($k) {
return $k['name'] . '----' . ['age'];
}, $b);


var_dump(json_encode($c));
var_dump(json_encode($b));

string(43) “[“zz—-Array”,”ls—-Array”,”hh—-Array”]” string(4) “
“ string(69) “[{“name”:”zz”,”age”:12},{“name”:”ls”,”age”:13},{“name”:”hh”,”age”:8}]”

2.2 array_walk

1
2
3
4
5
6
7
8
9
10
$b = [
['name' => 'zz', 'age' => 12],
['name' => 'ls', 'age' => 13],
['name' => 'hh', 'age' => 8]
];

array_walk($b, function ($k){
var_dump($k);
var_dump("<br>");
});

array(2) { [“name”]=> string(2) “zz” [“age”]=> int(12) } string(4) “
“ array(2) { [“name”]=> string(2) “ls” [“age”]=> int(13) } string(4) “
“ array(2) { [“name”]=> string(2) “hh” [“age”]=> int(8) } string(4) “

如果想要改变原数组的值,则需要使用引用:

1
2
3
4
5
6
array_walk($b, function ($k) use (&$b){
$b[$k['name']] = $k['age'];
});

var_dump(json_encode($b));
var_dump("<br>");

string(112) “{“0”:{“name”:”zz”,”age”:12},”1”:{“name”:”ls”,”age”:13},”2”:{“name”:”hh”,”age”:8},”zz”:12,”ls”:13,”hh”:8,””:null}” string(4) “

3 关键点

  • array_map 主要是为了得到你的回调函数处理后的新数组,要的是结果。
  • array_walk 主要是对每个参数都使用一次你的回调函数,要的是处理的过程。
  • array_walk 可以认为提供额外参数给回调函数,map不可以
  • array_walk 主要是要对数组内的每个值进行操作,操作结果影响原来的数组
  • array_map 主要是对数组中的值进行操作后返回数组,以得到一个新数组
  • array_walk 可以没有返回值 map要有,因为要填充数组

Reference

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号