php 生成器 入门理解

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

 问题:得到一个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
				
时间: 2024-10-08 09:52:30

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

线段树入门理解

在复习算法至分治法时,书本上主要介绍了合并排序和快速排序,较为简单.特拓展简单学习一个应用了分治法的算法结构--线段树. acm刷题时遇到许多连续区间的动态查询问题,例如求取某一区间上元素之和.求取某一区间上元素的最大值,此时如果使用一般的方法求解会使得时间超出要求.此时需要使用到线段树,其主要用于高效解决连续区间的动态查询问题. 线段树,类似区间树,是一个完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN),从而大大减少耗时

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

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

WCF的入门理解

一.什么是WCF WCF是微软弄的一组数据通信的开发接口,即windows通讯接口.(我个人理解为web service的升级版) WCF的最终目的是通过进程或者不同的系统,通过本地网络或者通过Internet(外网)收发客户端和服务端之间的消息. 二.WCF使用所需要注意的     因为是WCF通讯接口而且目的是收发客户端与服务端之间的消息,那么就需要有服务端代码和客户端代码. 服务端: 在服务端可以看到有2个文件一个是Service1.svc这个是放你的详细代码的地方,一个是IService

python 生成器的理解和总结

1. 生成器 利用迭代器,我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记录,进而才能根据当前状态生成下一个数据.为了达到记录当前状态,并配合next()函数进行迭代使用,我们可以采用更简便的语法,即生成器(generator).生成器是一类特殊的迭代器. 2. 创建生成器方法1 要创建一个生成器,有很多种方法.第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( ) 3. 创建生成器方法2 gene

PHP 生成器入门

https://juejin.im/entry/5b4c2d76f265da0f697029ad PHP 在 5.5 版本中引入了「生成器(Generator)」特性,不过这个特性并没有引起人们的注意.在官方的 从 PHP 5.4.x 迁移到 PHP 5.5.x 中介绍说它能以一种简单的方式实现迭代器(Iterator). 生成器实现通过 yield 关键字完成.生成器提供一种简单的方式实现迭代器,几乎无任何额外开销或需要通过实现迭代器接口的类这种复杂方式实现迭代. 文档提供了一个简单的实例演示

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

如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成器功能的确非常有用. 优点 直接讲概念估计你听完还是一头雾水,所以我们先来说说优点,也许能勾起你的兴趣.那么生成器有哪些优点,如下: 生成器会对PHP应用的性能有非常大的影响 PHP代码运行时节省大量的内存 比较适合计算大量的数据 那么,这些神奇的功能究竟是如何做到的?我们先来举个例子. 概念引入

迭代器和生成器入门

Python 迭代器生成器 迭代器.生成器这些概念名称真是让人头大,其实它们的原理特别简单.深刻. 可迭代对象(iterable) 在讲迭代器和生成器之前,必须要讲的一个概念就是可迭代对象. 可迭代对象之前需要聊一下Python中的那些内置数据结构--列表.字典.集合.元组等,这些数据结构就像一个装有内置数据的容器. 这里可以这么想--把数据想象成苹果,把列表.字典.集合.元组等想像成装苹果的袋子.盒子.篮子.筐子等装苹果的容器. 我们都能从这些容器中一个一个把所有苹果拿出来,这就像是我们经常使

SVG 入门——理解viewport,viewbox,preserveAspectRatio

工欲善其事必先利其器,没有真正搞懂SVG里的viewport,viewbox, preserveAspectRatio这三个属性,就很容易遇到坑,最近写项目用到svg这三个属性被我一眼就略过 ,后来发现自己并没有理解透,导致写项目产生了奇怪的坑,后面解决了,就是原理没通透,趁着大周末,来一波整理吧 一.这些理论知识必不可少 1.viewport <svg width="400" height="200"></svg> 上面svg中定义的是一个

MyBatis简单使用和入门理解

本文记录第一次使用Mybatis时碰到的一些错误和简单理解,采用的示例是Eclipse中的JAVA工程,采用XML文件定义数据库连接. 可以使用Java JDBC API直接操作数据库,但使用框架会更便捷.高效而且还可以利用框架提供的某些强大的功能(比如事务管理),而Mybatis就是这样的一个框架. Mybatis主要由四大部分组成: ①SqlSessionFactoryBuilder ②SqlSessionFactory ③SqlSession ④SQL Mapper 要想访问(操作)数据库