PHP迭代生成器的理解和使用

參考鳥哥博客
laravel-china文章

個(gè)別重點(diǎn)自己在此記錄下泻仙,希望大家還是參考鳥哥博客的那個(gè)文章

迭代生成器

(迭代)生成器也是一個(gè)函數(shù),不同的是這個(gè)函數(shù)的返回值是依次返回( 迭代生成器其實(shí)是生成了一個(gè)對(duì)象),而不是只返回一個(gè)單獨(dú)的值.

或者,換句話說,生成器使你能更方便的實(shí)現(xiàn)了迭代器接口.下面通過實(shí)現(xiàn)一個(gè)xrange函數(shù)來簡單說明:

function xrange($start,$end,$step=1){
    for ($i=$start; $i<=$end; $i+=$step){
        yield $i;
    }
}
//xrange(1,10) ;
foreach (xrange(1,10,2) as $key=>$num){
    echo $key.'=>'.$num.'<br>';
}
// 打印
0=>1
1=>3
2=>5
3=>7
4=>9

function xrange($start,$end,$step=1){
    for ($i=$start; $i<=$end; $i+=$step){
        yield $i;
    }
}
var_dump(xrange(1,10,2));
// 打印得到   object(Generator)#1 (0) { }
鳥哥原本的例子是

解析:上面這個(gè)xrange()函數(shù)提供了和PHP的內(nèi)建函數(shù)range()一樣的功能.但是不同的是range()函數(shù)返回的是一個(gè)包含值從1到100萬0的數(shù)組,而xrange()函數(shù)返回的是依次輸出這些值的一個(gè)迭代器, 而不會(huì)真正以數(shù)組形式返回.

這種方法的優(yōu)點(diǎn)是顯而易見的.它可以讓你在處理大數(shù)據(jù)集合的時(shí)候不用一次性的加載到內(nèi)存中.甚至你可以處理無限大的數(shù)據(jù)流.

當(dāng)然,也可以不同通過生成器來實(shí)現(xiàn)這個(gè)功能,而是可以通過繼承Iterator接口實(shí)現(xiàn).但通過使用生成器實(shí)現(xiàn)起來會(huì)更方便,不用再去實(shí)現(xiàn)iterator接口中的5個(gè)方法了.

使用數(shù)組

function xrange($start,$end,$step=1){
    for ($i=$start; $i<=$end; $i+=$step){
        echo $i.'<br>';
    }
}
xrange(1,10,2);
// 打印
1
3
5
7
9

生成器為可中斷的函數(shù)

要從生成器認(rèn)識(shí)協(xié)程, 理解它內(nèi)部是如何工作是非常重要的: 生成器是一種可中斷的函數(shù), 在它里面的yield構(gòu)成了中斷點(diǎn).

還是看上面的例子, 調(diào)用xrange(1,1000000)的時(shí)候, xrange()函數(shù)里代碼其實(shí)并沒有真正地運(yùn)行. 它只是返回了一個(gè)迭代器:

<?php
$range = xrange(1, 1000000);
var_dump($range); // object(Generator)#1
var_dump($range instanceof Iterator); // bool(true)
?>

這也解釋了為什么xrange叫做迭代生成器, 因?yàn)樗祷匾粋€(gè)迭代器, 而這個(gè)迭代器實(shí)現(xiàn)了Iterator接口.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末继谚,一起剝皮案震驚了整個(gè)濱河市老速,隨后出現(xiàn)的幾起案子躁绸,更是在濱河造成了極大的恐慌做鹰,老刑警劉巖僧鲁,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伤柄,死亡現(xiàn)場離奇詭異,居然都是意外死亡去团,警方通過查閱死者的電腦和手機(jī)抡诞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門拜马,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沐绒,你說我怎么就攤上這事俩莽。” “怎么了乔遮?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵扮超,是天一觀的道長。 經(jīng)常有香客問我蹋肮,道長出刷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任坯辩,我火速辦了婚禮馁龟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漆魔。我一直安慰自己坷檩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布改抡。 她就那樣靜靜地躺著矢炼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阿纤。 梳的紋絲不亂的頭發(fā)上句灌,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音欠拾,去河邊找鬼胰锌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛藐窄,可吹牛的內(nèi)容都是我干的资昧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枷邪,長吁一口氣:“原來是場噩夢啊……” “哼榛搔!你這毒婦竟也來了诺凡?” 一聲冷哼從身側(cè)響起东揣,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腹泌,沒想到半個(gè)月后嘶卧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凉袱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年芥吟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侦铜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钟鸵,死狀恐怖钉稍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棺耍,我是刑警寧澤贡未,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蒙袍,受9級(jí)特大地震影響俊卤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜害幅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一消恍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧以现,春花似錦狠怨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至无宿,卻和暖如春茵汰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孽鸡。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蹂午, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彬碱。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓豆胸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巷疼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晚胡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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