概念太晦涩,看不懂,直接上例子:

 问题:得到一个1-1000000的整数数组,然后用foreach遍历输出

 如果没有生成器,这样做:

$arr=range(1,1000000);//这个函数最终会返回一个数组;
foreach ($arr as $key => $value) {//此时遍历的是整个放在内存中的数组
echo $key.'=>'.$value.'<br />'; //输出
}
//总结:由迭代器我们可以知道,foreach的时候,每次遍历都会操作内存中的数组的键值,改变指针指向等等,
//遍历一次,操作一次数组,这样很耗费内存 如果有生成器,这样做:
function xrange( $start ,  $limit ,  $step  =  1 ) {//简单写一个range()
for ( $i = $start ; $i <= $limit ; $i += $step ) {
yield $i ; //yield会将当前值返回,而不是保存到数组中
}
}
foreach(xrange(1,1000000)as $key=>$value){//这里遍历时,遍历的是一个xrange的返回值(不是数组)
echo $key.'=>'."$value".'<br />' ;//输出
}
//总结:foreach每次遍历,都会调用一次xrange函数,而每调用一次xrange函数,都能得到一个yield的返回值,
//然后yield会将下一个值放到自己里面,等到foreach下次遍历yield会返回这个值,然后再将下一个值放到自己里面...
//这就是yield,它使得foreach的时候可以不用每次遍历都操作内存中的数组,遍历的时候直接就有被遍历的值了,
//不用再去操作数组然后再得到要被遍历的值 至于其他相关高深内容,去查看手册和大神们的帖子吧!
ps:yield想要生效,前提是php的版本>=5.5.0

php 生成器 入门理解的更多相关文章

  1. 动态规划初级 入门理解 C#代码

      using System; using System.Collections.Generic; using System.Linq; using System.Text; using Micros ...

  2. PHP 生成器Generators的入门理解和学习

    什么是生成器Generators 生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间.相反,你可以写一个生成器 ...

  3. (转载)Java多线程入门理解

    转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...

  4. PHP性能优化利器:生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  5. 现代 PHP 新特性 —— 生成器入门(转)

    原文链接:blog.phpzendo.com PHP 在 5.5 版本中引入了「生成器(Generator)」特性,不过这个特性并没有引起人们的注意.在官方的 从 PHP 5.4.x 迁移到 PHP ...

  6. PHP 生成器入门

    https://juejin.im/entry/5b4c2d76f265da0f697029ad PHP 在 5.5 版本中引入了「生成器(Generator)」特性,不过这个特性并没有引起人们的注意 ...

  7. python 生成器的理解和总结

    1. 生成器 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数 ...

  8. PHP 生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  9. python 进阶篇 迭代器和生成器深入理解

    列表/元组/字典/集合都是容器.对于容器,可以很直观地想象成多个元素在一起的单元:而不同容器的区别,正是在于内部数据结构的实现方法. 所有的容器都是可迭代的(iterable).另外字符串也可以被迭代 ...

随机推荐

  1. C++:构造函数和析构函数能否为虚函数

    原文:http://blog.csdn.net/xhz1234/article/details/6510568 C++:构造函数和析构函数能否为虚函数? 简单回答是:构造函数不能为虚函数,而析构函数可 ...

  2. 为laravel分页样式制定class

    做的项目有一个上翻页和下翻页,使用了框架提供的

  3. ie提示jquer缺少标识符,字符串或数字

    属性之间是要用","分隔的,但最后一个属性的后面在IE中是不能有的,firefox可有可无. 至于最后的";"是另外一回事了.这是Javascript的语法问题 ...

  4. selenium python 环境搭建(64位 windows)

    之前写了同样的文章,可是后来自己按照给文章再次搭建环境当搭建环境成功后却发现还是无法用.使用from selenium import webdriver,在run的时候却出现ImportError: ...

  5. css笔记01:CSS例子

    body { margin:0; padding:0; background:#000 url('images/backgrounds/star.png') no-repeat fixed; font ...

  6. 【Java Tips】boolean的类型与string类型的转换

    boolean类型转化为string boolean b = true; String s = String.valueOf(b); System.out.println(s);

  7. template和templateUrl区别与联系

    templateUrl其实根template功能是一样的,只不过templateUrl加载一个html文件,template后面根的是html的标签. .state('menu.about', { u ...

  8. 关于启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!

  9. [未完成]关于Eclipse4RCP书中内容总结

    原文地址http://www.vogella.com/tutorials/EclipseRCP/article.html Table of Contents 1. Eclipse 4 1.1. Wha ...

  10. tomcat 安装

    升级系统之后很长一段时间没有用tomcat(主要是没做东西),这两天要开始干活了,发现竟然没法发用了....ok,重新整一遍.算是温习. 上次所有环境的搭建基本都是师兄帮我,自己做得东西很少,这次就正 ...