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 请求单例 )可以被多次访问修改,而对数组本身顺序的操作,则可以达到实现中间件优级的调整或固定顺序处理之目的
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!