迭代器

可在内部迭代自己的外部迭代器或类的接口。详情: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(迭代器)接口和生成器相关推荐

  1. Iterator迭代器接口讲解

    Iterator迭代器接口 使用Iterator接口遍历集合元素 1 Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素. 2 GOF给迭代器模式的定义 ...

  2. 迭代器 (Iterator迭代器接口)

    1.Iterator接口介绍 lterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素. java集合分为Collection(单列集合)和Map(双列集合) ...

  3. Java基础23-集合类2(Set接口,Iterator迭代器)

    一.Set接口简介 根据API,Set接口是一个不包含重复元素的 collection.更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null ...

  4. es6 迭代器(遍历器)Iterator 自定义遍历器 lterator/简单模拟values方法 for of运行机制 Array/Set/Map默认迭代器接口 对象设置迭代器

    文章目录 迭代器 Iterator 用处 (需要自定义遍历数据的时候) 自定义 遍历器 lterator 简单模拟values方法 Array Set Map 默认迭代器接口 entries valu ...

  5. 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 ...

  6. Java基础加强重温_05:Iterator迭代器、增强for循环、集合综合案例-斗地主、数据结构(栈、队列、数组、链表、红黑树)、List接口、Set接口

    摘要: Java基础加强重温_05: Iterator迭代器(指针跟踪元素). 增强for循环(格式.底层). 集合综合案例-斗地主(代码规范抽取代码,集合元素打乱). 数据结构[栈(先进后出,子弹夹 ...

  7. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  8. 设计模式 - Iterator(迭代器)

    2019独角兽企业重金招聘Python工程师标准>>> 模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素. 设计一个 ...

  9. Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)

    1. Iterator迭代器 所有Collection的实现类都实现了iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素迭代的便利.在java.util包下. 1) ...

最新文章

  1. 比 GPT-3 更擅长理解用户意图,OpenAI发布 InstructGPT
  2. APP用户的生命周期价值(LTV)
  3. 成幻Online Judge 1.00 Beta 正式发布 2007.6.22
  4. Android数据库LitePal的存储操作
  5. MySQL怎么打开explain_MySQL干货之-利用EXPLAIN优化查询
  6. 终于,一键打通微信和QQ
  7. SVN工作笔记005---TortoiseSVN SendRpt.exe not found解决方案
  8. Python、PyCharm、Django框架安装
  9. Linux系统基本操作(二)—设置本地光盘为yum源
  10. OSGi运行环境下java反序列化问题的解决方式
  11. 看代码学知识之(1) 获取当前线程状态
  12. 洛谷 P1881 绳子对折
  13. css如何设置div中的内容垂直居中?
  14. Arduino AFMotor 电机扩展板概述
  15. 家用计算机时间,电脑时间校准方法,怎么校准电脑时间
  16. AppCan:打造成云生态的移动PaaS平台
  17. 大数据学习——hive阶段:启动HiveServer2启动报TezConfiguration类NoClassDefFoundError错误
  18. JSP中文乱码解决方案了解和TOMCAT中文乱码解决
  19. 【洛谷】P1150 Peter的烟(配数学证明)
  20. 高仿人人车 范围选择器

热门文章

  1. 整理sqlserver 级联更新和删除 c#调用存储过程返回值
  2. TWaver With JavaFX
  3. Query Generation Module-NTU用多样性的query生成,涨点基于文本的实例分割(已开源)...
  4. 【开源】对基于图像背景的字体生成、人体姿势预测、关键点检测、超分辨率等探讨...
  5. 百度视觉技术部人脸检测方向招聘实习生~北京
  6. 奖金67万!2020 中国计算机学会大数据与计算智能大赛启动!
  7. CVPR 2020 分方向论文大盘点合集
  8. CVPR 2020 oral:亮风台提出完全可训练的图匹配方法
  9. ICCV 2019 | 微软开源无监督学习的医学图像配准方法:递归级联网络
  10. 图像分类任务中的tricks总结