array_reduce 多值化一
array_reduce
常出没于框架中间件,类似于linux
中的管道,起着穿针引线的效用,本文浅析其原理。
原型
array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] ) : mixed
callback ( mixed $carry , mixed $item ) : mixed
- 参数
carry
携带上次迭代里的值; 如果本次迭代是第一次,那么这个值是initial
item
携带了本次迭代的值initial
如果指定了可选参数 initial,该参数将在处理开始前使用,或者当处理结束,数组为空时的最后一个结果
- 返回值
- 返回
initial
参数,array_reduce()
返回NULL
- 5.3.0+ 修改
initial
类型,允许传入mixed
,之前只能是integer
- 返回
原理
array_reduce
函数内部实现机制,用下面的代码表示更形象
function array_reduce2($array, $callback, $initial=null){
$acc = $initial;
foreach($array as $a)
$acc = $callback($acc, $a);
return $acc;
}
array_reduce2([2,4],function($carry,$x){
return $carry+$x;
}); // 6
进阶
array_reduce
可用多个可迭代序列元素有序叠加处理初始值,而它的返回结果类型,通常由初始initial
类型决定- 当数组序列元素为一个个函数(可调用对象
callable
,意味着可为实例方法,可调用实例,php支持的动静方法调用方式...), 则能实现对特定变量进行一系列各种不同的逻辑处理 - 如下,将一个序列函数的嵌套调用组合为
array_reduce
产生的新函数调用
function compose(...$functions){
return array_reduce(
$functions,
function($carry,$function){
return function($x)use($carry,$function){
return $function($carry($x));
};
},
function($x){
return $x;
}
);
}
- 效果
$compose = compose(
// 加 2
function ($x) {
return $x + 2;
},
// 乘 4
function ($x) {
return $x * 4;
}
);
$res = $compose(3); // (3+2)*4 = 20
其它
- 类似的多值化一,
javascript
官方亦有提供,原理一致 - 进一步扩展,如果数组元素为实现相同接口的不同实例,则意味着初始变量(比如
request
请求单例 )可以被多次访问修改,而对数组本身顺序的操作,则可以达到实现中间件优级的调整或固定顺序处理之目的
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: