PHP:Iterator(迭代器)接口和生成器
迭代器
可在内部迭代自己的外部迭代器或类的接口。详情:http://php.net/manual/zh/class.iterator.php
接口摘要
Iterator extends Traversable {
/* 方法 */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public bool valid ( void )
}
- Iterator::current — 返回当前元素
- Iterator::key — 返回当前元素的键
- Iterator::next — 向前移动到下一个元素
- Iterator::rewind — 返回到迭代器的第一个元素
- Iterator::valid — 检查当前位置是否有效
基本用法:
<?php
class myIterator implements Iterator {private $position = 0;private $array = array("firstelement","secondelement","lastelement",); public function __construct() {$this->position = 0;}function rewind() {$this->position = 0;}function current() {return $this->array[$this->position];}function key() {return $this->position;}function next() {++$this->position;}function valid() {return isset($this->array[$this->position]);}
}$it = new myIterator;
foreach($it as $key => $value) {echo "$key=>$value\n";
}
?>
下面用迭代器来实现一个斐波纳契数列:
<?php
class myIterator implements Iterator {private $position = 0;private $current=1;private $prev=0;public function __construct() {$this->position = 0;}public function rewind() {$this->position = 0;$this->current=1;$this->prev=0;}public function current() {return $this->current;}public function key() {return $this->position;}public function next() {$tem=$this->prev;$this->prev=$this->current;$this->current=$this->current+$tem;++$this->position;}public function valid() {return ($this->current!==false);}
}$it = new myIterator;
foreach($it as $key => $value) {if($key>15) break;echo "$value ";
}
?>
返回结果:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
生成器
生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。
写一个斐波纳契数列生成器,代码如下:
<?php
function gen() {$current=1;$prev=0;while ($current){yield $current;$temp=$current;$current=$current+$prev;$prev=$temp;}}
foreach (gen() as $k=>$v){if($k>15) break;echo "$v ";
}
结果
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
转载于:https://www.cnblogs.com/goufugui/p/9436749.html
PHP:Iterator(迭代器)接口和生成器相关推荐
- Iterator迭代器接口讲解
Iterator迭代器接口 使用Iterator接口遍历集合元素 1 Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素. 2 GOF给迭代器模式的定义 ...
- 迭代器 (Iterator迭代器接口)
1.Iterator接口介绍 lterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素. java集合分为Collection(单列集合)和Map(双列集合) ...
- Java基础23-集合类2(Set接口,Iterator迭代器)
一.Set接口简介 根据API,Set接口是一个不包含重复元素的 collection.更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null ...
- es6 迭代器(遍历器)Iterator 自定义遍历器 lterator/简单模拟values方法 for of运行机制 Array/Set/Map默认迭代器接口 对象设置迭代器
文章目录 迭代器 Iterator 用处 (需要自定义遍历数据的时候) 自定义 遍历器 lterator 简单模拟values方法 Array Set Map 默认迭代器接口 entries valu ...
- Java基础知识(二)(Object类的常用方法、日期时间类、System类、StringBuilder类、包装类、Collection集合、Iterator迭代器、泛型、list集Set接口...)
文章目录 Java基础知识(二) 1.Object类的常用方法 1.1 toString方法 1.2 equals方法 1.3 Objects类 2.日期时间类 2.1 Date类 2.2 DateF ...
- Java基础加强重温_05:Iterator迭代器、增强for循环、集合综合案例-斗地主、数据结构(栈、队列、数组、链表、红黑树)、List接口、Set接口
摘要: Java基础加强重温_05: Iterator迭代器(指针跟踪元素). 增强for循环(格式.底层). 集合综合案例-斗地主(代码规范抽取代码,集合元素打乱). 数据结构[栈(先进后出,子弹夹 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- 设计模式 - Iterator(迭代器)
2019独角兽企业重金招聘Python工程师标准>>> 模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素. 设计一个 ...
- Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)
1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1) ...
最新文章
- 比 GPT-3 更擅长理解用户意图,OpenAI发布 InstructGPT
- APP用户的生命周期价值(LTV)
- 成幻Online Judge 1.00 Beta 正式发布 2007.6.22
- Android数据库LitePal的存储操作
- MySQL怎么打开explain_MySQL干货之-利用EXPLAIN优化查询
- 终于,一键打通微信和QQ
- SVN工作笔记005---TortoiseSVN SendRpt.exe not found解决方案
- Python、PyCharm、Django框架安装
- Linux系统基本操作(二)—设置本地光盘为yum源
- OSGi运行环境下java反序列化问题的解决方式
- 看代码学知识之(1) 获取当前线程状态
- 洛谷 P1881 绳子对折
- css如何设置div中的内容垂直居中?
- Arduino AFMotor 电机扩展板概述
- 家用计算机时间,电脑时间校准方法,怎么校准电脑时间
- AppCan:打造成云生态的移动PaaS平台
- 大数据学习——hive阶段:启动HiveServer2启动报TezConfiguration类NoClassDefFoundError错误
- JSP中文乱码解决方案了解和TOMCAT中文乱码解决
- 【洛谷】P1150 Peter的烟(配数学证明)
- 高仿人人车 范围选择器
热门文章
- 整理sqlserver 级联更新和删除 c#调用存储过程返回值
- TWaver With JavaFX
- Query Generation Module-NTU用多样性的query生成,涨点基于文本的实例分割(已开源)...
- 【开源】对基于图像背景的字体生成、人体姿势预测、关键点检测、超分辨率等探讨...
- 百度视觉技术部人脸检测方向招聘实习生~北京
- 奖金67万!2020 中国计算机学会大数据与计算智能大赛启动!
- CVPR 2020 分方向论文大盘点合集
- CVPR 2020 oral:亮风台提出完全可训练的图匹配方法
- ICCV 2019 | 微软开源无监督学习的医学图像配准方法:递归级联网络
- 图像分类任务中的tricks总结