array_reduce、array_walk、array_map
array_reduce
先看PHP手册的官方定义:用回调函数迭代地将数组简化为单一的值。
上代码:
$arr = [
["id"=>1,'name'=>"a"],
["id"=>2,"name"=>"c"],
["id"=>3,"name"=>"d"]
];
$initial = null;
echo array_reduce($arr , function($lastData , $nowData){
return empty($lastData) ? $nowData['id'] : $lastData.','. $nowData['id'];
},$initial);
运行结果:
1,2,3
需要注意的是:
- function中的两个参数,第一个
$lastData
是上次迭代里的值,第二个$nowData
是本次迭代里的值。 $initial
是可选参数,可以在这些迭代前面统一加一个初始值,或者处理结束后的默认值。- 返回的这个“单一的值”可以是字符串、数字等简单类型,不可以是数组、对象等复杂类型。
函数的返回值:处理后生成的数据。
array_walk
先看PHP手册官方定义:使用用户自定义函数对数组中的每个元素做回调处理。
上代码:
function doSomething(&$value,$key,$other='')
{
echo "{$key} , {$value['id']} , {$value['name']} , {$other}<br>";
if ($key==1) {
$value['name']='22';
}
}
$arr = [
["id"=>1,'name'=>"a"],
["id"=>2,"name"=>"c"],
["id"=>3,"name"=>"d"]
];
$other = 'asdf';
array_walk($arr, 'doSomething', $other);
print_r($arr);
运行结果:
0 , 1 , a , asdf
1 , 2 , c , asdf
2 , 3 , d , asdf
Array ( [0] => Array ( [id] => 1 [name] => a ) [1] => Array ( [id] => 2 [name] => 22 ) [2] => Array ( [id] => 3 [name] => d ) )
注意:
array_walk
这个函数的第二个参数是调用一个自定义函数,被调用的自定义函数可以有三个参数(第三个参数非必须),如果有的话,需要给array_walk
添加第三个参数传给它。- 如需要修改数据内元素的值,可以在函数的第一个参数前加“&”。
- 该函数用法大致类似于
foreach
,只有一项不同:foreach
可以在循环过程中更改数组结构,例如增加/删除单元、unset 单元等,但是array_walk
不可以更改数组的结构。
函数的返回值:true或false
array_map
先看PHP手册的官方定义:为数组的每个元素应用回调函数。
上代码:
echo "<pre>";
$a = [1, 2, 3];
$b = ['one', 'two', 'three'];
$c = ['a', 'b'];
function fanyi($val1, $val2)
{
return "{$val1} : {$val2}";
}
$res = array_map('fanyi', $a, $b);
print_r($res);
$res = array_map(null, $a, $b, $c);
print_r($res);
运行结果:
Array
(
[0] => 1 : one
[1] => 2 : two
[2] => 3 : three
)
Array
(
[0] => Array
(
[0] => 1
[1] => one
[2] => a
)
[1] => Array
(
[0] => 2
[1] => two
[2] => b
)
[2] => Array
(
[0] => 3
[1] => three
[2] =>
)
)
该函数有两个用途:
- 遍历数组中的每个元素,并用自定义方法处理。
- 可用于构建一个多维数组,每个数组的长度必须相同,否则短的数组会用空值扩充成对应长度。
返回值:
- 返回数组,包含 callback 函数处理之后 array (有多个数组时,为 arrays) 对应索引所有元素作为函数的参数。
- 当仅仅传入一个数组时,返回的数组会保留传入参数的键(key)。 传入多个数组时,返回的数组键是按顺序的 integer。