定义:

生成器:“动态生成内容的数组”,用到值的时候才去生产。
搭配使用:关键字 yield foreach

过程:

  1. 作为生成器的方法相当于定义了一个数组;
  2. 生成器中的 yield,每次出现相当于定义了一个数组中出现的值;
  3. foreach 会遍历生成器中所有的 yield 定义的值(某个被定义的值(表达式),只有在被用到的时候,当前yield同上一个yield之间的其他表达式才会被执行,当前yield之后的表达式不会被执行);
  4. foreach 正常结束的话(不是break),判断一下生成器中最后一个yield之后是否有其他表达式未执行完,是的话,执行之;
  5. 不同于线程,不是并行执行,只是在主业务逻辑和生成器之间来回切换执行,只节省了空间,时间没省下来。

设想使用场景:

1、取大数据文件,生成器中逐行读取;
2、???

例子:

  gen.php1 <?php2 function gen()3 {4     echo '生成器开始执行' . PHP_EOL;5     for ($i = 0; $i < 5; $i++) {6         echo '产生数据之前:' . $i  . PHP_EOL;7         yield $i; 8         echo '产生数据之后:' . $i  . PHP_EOL;9     }   10     echo '再来一个数据' . PHP_EOL;11     yield 5;12     echo '生成器执行结束' . PHP_EOL;13 }   14 $gen_func = gen();15 echo '生成器开始执行了吗?' . PHP_EOL;16 foreach ($gen_func as $key  => $val) {17     echo '使用数据前' . PHP_EOL;18     echo '使用数据:' . $val . PHP_EOL;19     echo '使用数据后' . PHP_EOL;20     //if ($key >= 4) {21         //break;22     //} 23 }

执行结果:

php gen.php
生成器开始执行了吗?
生成器开始执行
产生数据之前:0
使用数据前
使用数据:0
使用数据后
产生数据之后:0
产生数据之前:1
使用数据前
使用数据:1
使用数据后
产生数据之后:1
产生数据之前:2
使用数据前
使用数据:2
使用数据后
产生数据之后:2
产生数据之前:3
使用数据前
使用数据:3
使用数据后
产生数据之后:3
产生数据之前:4
使用数据前
使用数据:4
使用数据后
产生数据之后:4
再来一个数据
使用数据前
使用数据:5
使用数据后
生成器执行结束

部分执行过程解读:

1、14行并没有调用生成器gen(),只是做了定义;
2、进入 foreach 循环后,开始调用gen();
3、$val 需要值的时候,记住当前位置a,执行生成器;
4、执行到 yield 定义的地方,取到值了,记住当前位置b,返回位置a;
5、循环3、4两步;
6、循环结束,执行完 yield 最后一次定义的地方的之后的剩下部分;
7、去掉20、21、22行的注释后执行,"使用数据:4 使用数据后",就不再有其他输出。

其他(仅验证了PHP7.1.14版本)

1、$data = (yield $value);//YES $data = yield $value;//NO
2、可以使用yield $key => $val;
3、PHP7之后,yield from 可以调用生成器、数组、使用return等。
(传送门:PHP手册里都有)

PHP生成器--动态生成内容的数组相关推荐

  1. c语言动态生成二维数组,C语言 动态创建二维数组

    /*C语言 如何动态创建二维数组 转化为一维数组申请数组,创建和释放都比较简单 */ #include #include #include #define RANK 10 #define COLUMN ...

  2. Python 动态生成多维数组

    参考:http://blog.csdn.net/theonegis/article/details/50775076 多维数组其实就是多个一维数组的嵌套,Python中有原生的list,类似一个动态数 ...

  3. cocos 制作动态生成内容的列表_零代码工具,让你在线轻松制作交互内容!

    在工作中设计师不会写代码,懂代码的不会设计,2种不同工作互掐的情况屡见不鲜,那我们如何把这2项工作一并融合贯通呢?对于不懂代码的职场"小白",我们可以利用一些零代码工具来完成.今天 ...

  4. 【PHPWord】基于Word模板替换生成输出表格动态生成内容、合并单元格、设置单元格背景颜色

    文章目录 一.前言 二.业务需求 三.功能实现 1.处理数据 2.Word模板 3.输出动态数据 四.完整代码和模板 1.Word模板 2.完整代码 五.总结 一.前言 在之前的文章中,我们做了直接生 ...

  5. vue 嵌套表格组件_使用form-create动态生成vue自定义组件和嵌套表单组件

    使用form-create动态生成vue自定义组件和嵌套表单组件 maker.create 通过建立一个虚拟 DOM的方式生成自定义组件 生成 Maker let rule = [ formCreat ...

  6. echarts 动态设置标题_echart动态生成标题

    echart是一个商业级别的数据图标,一个纯JavaScript的图标库,下面是echart动态生成标题的实现方式 一.设置相关变量 var monthId=[]; var monthId1; var ...

  7. VUE : 双重 for 循环写法、table 解析任意 list 、万能表格组件、解析一维数组、动态生成 table 所有数据

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.需求: 我想要一个 table 组件能在实际调用时动态生成所有的  tr .td . 后端返回的 ...

  8. ajax动态选项卡,如何将动态生成的ajax内容附加到jquery ui选项卡中新添加的选项卡?...

    我在侧面板上有以下表格的表格: one two three four 当有人点击该列的某一行时,该行的标题将作为参数传递给在主面板中显示搜索结果的函数. $("#content-displa ...

  9. Java 读取 Excel 文件内容, 根据 pdf 模板动态生成对应的 pdf 文件

    1. 下载 adobe acrobat https://www.cr173.com/soft/11135.html 2. 编辑 pdf 模板 1用 acrobat 打开 pdf 编辑模板 添加表单元素 ...

最新文章

  1. opencv4.2.0 视频去抖动算法代码
  2. 【机器学习】机器学习中必知必会的 8 种降维技术,最后一款超硬核!
  3. php 张开收缩显示,js实现可以点击收缩或张开的悬浮窗
  4. css样式变 及实际用法
  5. apache 设置session超时时间_深入分析 Session 和 Cookie,看这篇就对了
  6. (转)C#开发微信门户及应用(3)--文本消息和图文消息的应答
  7. SAP License:FI中的表连接与应用
  8. tomcat 日志配置
  9. 用鼠标获取任意窗口的句柄, 并把它当作干儿子
  10. linux查看cuda驱动程序,我的nvidia驱动程序的正确CUDA版本是什么?
  11. 必备知识:相机标定-旋转矩阵性质
  12. C# GDI winfrom 图像转换椭圆形
  13. 青少年沉迷游戏得鱼教育老师告诉家长如何处理
  14. 怎样才能掌握好计算机知识,简析怎样才能上好计算机课
  15. 排序算法——冒泡排序(图解+代码)
  16. Oracle数据库 表空间
  17. TL-WR740N_V4板TTL刷机指南_TFTP
  18. C 求爱因斯坦数学题有一条长阶,若每步跨 2阶 ,则 最后剩 l阶,
  19. 划重点!百度、阿里、腾讯大厂Android面试必问知识点系统梳理,啃一半公司随便挑
  20. 2.1 Basics

热门文章

  1. mysql 存储过程 模糊查询_mysql 分页创建存储过程并实现模糊查询
  2. c 语言中 %是什么运算符,C 语言基础----详解C中的运算符
  3. zstack信道_Zigbee信道原理
  4. python作用域的顺序_“Python”函数的参数和范围,及其,作用域
  5. php正则表达式经典实例,php半小时精通正则表达式
  6. 2017级软件2班安卓应用开发课程主页
  7. html5json转换为数组,将JSON数组转换为jQuery中的HTML表
  8. bzoj3238 [Ahoi2013]差异 后缀自动机
  9. php字符串原地反转,php反转字符串方法
  10. java spark on hive_hive-on-spark 安装 以及 scala 实例