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

需要注意的是:

  1. function中的两个参数,第一个$lastData是上次迭代里的值,第二个$nowData是本次迭代里的值。
  2. $initial是可选参数,可以在这些迭代前面统一加一个初始值,或者处理结束后的默认值。
  3. 返回的这个“单一的值”可以是字符串、数字等简单类型,不可以是数组、对象等复杂类型。

函数的返回值:处理后生成的数据。

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 ) )

注意:

  1. array_walk这个函数的第二个参数是调用一个自定义函数,被调用的自定义函数可以有三个参数(第三个参数非必须),如果有的话,需要给array_walk添加第三个参数传给它。
  2. 如需要修改数据内元素的值,可以在函数的第一个参数前加“&”。
  3. 该函数用法大致类似于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] => 
        )
)

该函数有两个用途:

  1. 遍历数组中的每个元素,并用自定义方法处理。
  2. 可用于构建一个多维数组,每个数组的长度必须相同,否则短的数组会用空值扩充成对应长度。

返回值:

  1. 返回数组,包含 callback 函数处理之后 array (有多个数组时,为 arrays) 对应索引所有元素作为函数的参数。
  2. 当仅仅传入一个数组时,返回的数组会保留传入参数的键(key)。 传入多个数组时,返回的数组键是按顺序的 integer。