array_reduce 的理解

看 laravel 時(shí)遇到一個(gè)函數(shù),琢磨了半天也沒(méi)有理解,最后還是查了下資料才完全理解。

這里還是再做下筆記加深下印象宠页。

php官方是這么寫的:

 array_reduce(array $array, callable $callback, [mixed $initial = null ])

什么意思呢礼饱,先舉個(gè)簡(jiǎn)單點(diǎn)兒的栗子:


<?php

function sum($carry, $item) {
    var_dump($carry, $item);
    $carry += $item;
    echo '<br><hr>';
    return $carry;
}

$a = array(1, 2, 3, 4, 5);

var_dump(array_reduce($a, 'sum', 10)); 

輸出結(jié)果為:

int(10) int(1)
int(11) int(2)
int(13) int(3)
int(16) int(4)
int(20) int(5)
int(25)

可以看出 array_reduce 的第三個(gè)參數(shù)傳給 callable sum 并作為第一個(gè)參數(shù)册倒,然后 array $a 的第一個(gè)元素作為第二個(gè)參數(shù)又官,即sum(10, 1)延欠,然后把計(jì)算結(jié)果返回給下一次迭代即 sum(11, 2),依次類推直至程序結(jié)束税朴。

簡(jiǎn)單的理解了宰啦,再來(lái)點(diǎn)復(fù)雜的肴颊,不過(guò)在開始之前服猪,先來(lái)熟悉下匿名函數(shù):

匿名函數(shù):

$name = 'well';
$greet = function () use ($name){
    echo 'hello ' ,$name;
};
$greet ();

# hello well


function closureFunc($name){
    $func = function() use ($name){
        echo "hello" ,$name;
    };
    $func();
}
closureFunc('well');
# hello well

接下來(lái)就是重點(diǎn)了供填,在 array_reduce 中使用匿名函數(shù),舉個(gè)例子罢猪,西瓜姑娘接到閨蜜電話出去玩近她,肯定要先化妝打扮一下再出門:

class MakeUp {
    public static function handle(Closure $next) {
        echo '化妝打扮', '<br>';;
        $next();

    }
}

$firstSlice = function (){
    echo '我要出去玩了~', '<br>';
};

$arr = [
    'MakeUp'
];

function getSlice(){
    return function ($stack, $pipe){
        return function () use ($stack, $pipe){
            return $pipe::handle($stack);
        };
    };
}

$go = array_reduce($arr, getSlice(), $firstSlice);

$go();

輸出結(jié)果為:

化妝打扮
我要出去玩了~

這段程序執(zhí)行時(shí)首先運(yùn)行 getSlice($firstSlice, 'DressUp'),然后拼裝執(zhí)行 MakeUp::handle()膳帕,
MakeUp::handle() 中先去化妝打扮粘捎,然后再通過(guò)匿名Closure $next執(zhí)行 $firstSlice 出門去玩。

如果覺得僅僅是化妝還不夠,還要再穿條美美的裙子出門攒磨,那么再對(duì)上邊的處理進(jìn)行改造泳桦,添加穿裙子的過(guò)程:


class Skirt {
    public static function handle(Closure $next) {
        echo '穿上裙子', '<br>';
        $next();
    }
}

$arr = [
    'MakeUp',
    'Skirt'
];


那么執(zhí)行過(guò)程會(huì)變成什么樣呢?為了看清楚執(zhí)行過(guò)程娩缰,先在 getSlice 中加上打优钛鳌:


function getSlice(){
    return function ($stack, $pipe){
        echo '<pre>';
        echo 'stack :';
        var_dump($stack);
        echo '<hr>';
        echo 'pipe :';
        var_dump($pipe);
        echo '</pre>';
        echo '<br><hr>';

        return function () use ($stack, $pipe){
            return $pipe::handle($stack);
        };
    };
}


執(zhí)行結(jié)果

可以看到第一次執(zhí)行時(shí),stack 是一個(gè)匿名函數(shù) , 也對(duì)應(yīng)了官網(wǎng)介紹的作為第一次迭代時(shí)漆羔,$carryinitial,也就是$firstSlice狱掂。pipeMakeUp,但是它并沒(méi)有執(zhí)行而是直接返回了演痒,也就是直接返回

 
function ($stack, $pipe){
        return function () use ($stack, $pipe){
            return $pipe::handle($stack);
        };

匿名函數(shù) function ($stack, $pipe)被返回后,也就相當(dāng)于一個(gè) array_reduce($arr, getSlice(), $firstSlice);趋惨,不同的是匿名函數(shù) function ($stack, $pipe)代替了$firstSlice被傳給下一次迭代鸟顺。

第二次迭代時(shí)執(zhí)行 Skire::handle,先穿上了美美的裙子器虾,然后$next 執(zhí)行匿名函數(shù) function ($stack, $pipe)讯嫂,也就是去MakeUp::handle,化妝后繼續(xù)執(zhí)行 $next兆沙,也就是匿名函數(shù) $firstSlice欧芽。

emmm,你大神就是你大神葛圃,不能不服氣千扔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市库正,隨后出現(xiàn)的幾起案子曲楚,更是在濱河造成了極大的恐慌,老刑警劉巖褥符,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龙誊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喷楣,警方通過(guò)查閱死者的電腦和手機(jī)趟大,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抡蛙,“玉大人护昧,你說(shuō)我怎么就攤上這事〈纸兀” “怎么了惋耙?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绽榛,道長(zhǎng)湿酸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任灭美,我火速辦了婚禮推溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘届腐。我一直安慰自己铁坎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布犁苏。 她就那樣靜靜地躺著硬萍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪围详。 梳的紋絲不亂的頭發(fā)上朴乖,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音助赞,去河邊找鬼买羞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雹食,可吹牛的內(nèi)容都是我干的畜普。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼婉徘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漠嵌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起盖呼,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤儒鹿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后几晤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體约炎,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年蟹瘾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了圾浅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憾朴,死狀恐怖狸捕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情众雷,我是刑警寧澤灸拍,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布做祝,位于F島的核電站,受9級(jí)特大地震影響鸡岗,放射性物質(zhì)發(fā)生泄漏混槐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一轩性、第九天 我趴在偏房一處隱蔽的房頂上張望声登。 院中可真熱鬧,春花似錦揣苏、人聲如沸悯嗓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绅作。三九已至,卻和暖如春蛾派,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背个少。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工洪乍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夜焦。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓壳澳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親茫经。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巷波,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容