PHP生成器--动态生成内容的数组
定义:
生成器:“动态生成内容的数组”,用到值的时候才去生产。
搭配使用:关键字 yield foreach
过程:
- 作为生成器的方法相当于定义了一个数组;
- 生成器中的 yield,每次出现相当于定义了一个数组中出现的值;
- foreach 会遍历生成器中所有的 yield 定义的值(某个被定义的值(表达式),只有在被用到的时候,当前yield同上一个yield之间的其他表达式才会被执行,当前yield之后的表达式不会被执行);
- foreach 正常结束的话(不是break),判断一下生成器中最后一个yield之后是否有其他表达式未执行完,是的话,执行之;
- 不同于线程,不是并行执行,只是在主业务逻辑和生成器之间来回切换执行,只节省了空间,时间没省下来。
设想使用场景:
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生成器--动态生成内容的数组相关推荐
- c语言动态生成二维数组,C语言 动态创建二维数组
/*C语言 如何动态创建二维数组 转化为一维数组申请数组,创建和释放都比较简单 */ #include #include #include #define RANK 10 #define COLUMN ...
- Python 动态生成多维数组
参考:http://blog.csdn.net/theonegis/article/details/50775076 多维数组其实就是多个一维数组的嵌套,Python中有原生的list,类似一个动态数 ...
- cocos 制作动态生成内容的列表_零代码工具,让你在线轻松制作交互内容!
在工作中设计师不会写代码,懂代码的不会设计,2种不同工作互掐的情况屡见不鲜,那我们如何把这2项工作一并融合贯通呢?对于不懂代码的职场"小白",我们可以利用一些零代码工具来完成.今天 ...
- 【PHPWord】基于Word模板替换生成输出表格动态生成内容、合并单元格、设置单元格背景颜色
文章目录 一.前言 二.业务需求 三.功能实现 1.处理数据 2.Word模板 3.输出动态数据 四.完整代码和模板 1.Word模板 2.完整代码 五.总结 一.前言 在之前的文章中,我们做了直接生 ...
- vue 嵌套表格组件_使用form-create动态生成vue自定义组件和嵌套表单组件
使用form-create动态生成vue自定义组件和嵌套表单组件 maker.create 通过建立一个虚拟 DOM的方式生成自定义组件 生成 Maker let rule = [ formCreat ...
- echarts 动态设置标题_echart动态生成标题
echart是一个商业级别的数据图标,一个纯JavaScript的图标库,下面是echart动态生成标题的实现方式 一.设置相关变量 var monthId=[]; var monthId1; var ...
- VUE : 双重 for 循环写法、table 解析任意 list 、万能表格组件、解析一维数组、动态生成 table 所有数据
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1.需求: 我想要一个 table 组件能在实际调用时动态生成所有的 tr .td . 后端返回的 ...
- ajax动态选项卡,如何将动态生成的ajax内容附加到jquery ui选项卡中新添加的选项卡?...
我在侧面板上有以下表格的表格: one two three four 当有人点击该列的某一行时,该行的标题将作为参数传递给在主面板中显示搜索结果的函数. $("#content-displa ...
- Java 读取 Excel 文件内容, 根据 pdf 模板动态生成对应的 pdf 文件
1. 下载 adobe acrobat https://www.cr173.com/soft/11135.html 2. 编辑 pdf 模板 1用 acrobat 打开 pdf 编辑模板 添加表单元素 ...
最新文章
- opencv4.2.0 视频去抖动算法代码
- 【机器学习】机器学习中必知必会的 8 种降维技术,最后一款超硬核!
- php 张开收缩显示,js实现可以点击收缩或张开的悬浮窗
- css样式变 及实际用法
- apache 设置session超时时间_深入分析 Session 和 Cookie,看这篇就对了
- (转)C#开发微信门户及应用(3)--文本消息和图文消息的应答
- SAP License:FI中的表连接与应用
- tomcat 日志配置
- 用鼠标获取任意窗口的句柄, 并把它当作干儿子
- linux查看cuda驱动程序,我的nvidia驱动程序的正确CUDA版本是什么?
- 必备知识:相机标定-旋转矩阵性质
- C# GDI winfrom 图像转换椭圆形
- 青少年沉迷游戏得鱼教育老师告诉家长如何处理
- 怎样才能掌握好计算机知识,简析怎样才能上好计算机课
- 排序算法——冒泡排序(图解+代码)
- Oracle数据库 表空间
- TL-WR740N_V4板TTL刷机指南_TFTP
- C 求爱因斯坦数学题有一条长阶,若每步跨 2阶 ,则 最后剩 l阶,
- 划重点!百度、阿里、腾讯大厂Android面试必问知识点系统梳理,啃一半公司随便挑
- 2.1 Basics
热门文章
- mysql 存储过程 模糊查询_mysql 分页创建存储过程并实现模糊查询
- c 语言中 %是什么运算符,C 语言基础----详解C中的运算符
- zstack信道_Zigbee信道原理
- python作用域的顺序_“Python”函数的参数和范围,及其,作用域
- php正则表达式经典实例,php半小时精通正则表达式
- 2017级软件2班安卓应用开发课程主页
- html5json转换为数组,将JSON数组转换为jQuery中的HTML表
- bzoj3238 [Ahoi2013]差异 后缀自动机
- php字符串原地反转,php反转字符串方法
- java spark on hive_hive-on-spark 安装 以及 scala 实例