前言:SPL是用于解决典型问题(standard problems)的一组接口与类的集合。

  1. <?php
  2.  
  3. /**
  4. * Class MyIterator
  5. * 在 PHP 中,通常情况下遍历数组使用 foreach 来遍历。
  6. * Iterator 接口,只要实现了这个接口,对象就可以通过 foreach 来迭代
  7. * foreach对象时,依次调用:
  8. * rewind() 重置到第一个元素
  9. * valid() 检查当前位置是否有效
  10. * current() 返回当前元素
  11. * key() 返回当前元素的键
  12. * next() 指向下一个元素
  13. */
  14. class MyIterator implements Iterator
  15. {
  16. private $arr;
  17. private $position;
  18.  
  19. public function __construct(Array $arr)
  20. {
  21. $this->arr = $arr;
  22. $this->position = 0;
  23. }
  24.  
  25. // 3、返回当前值
  26. public function current()
  27. {
  28. // TODO: Implement current() method.
  29. var_dump(__METHOD__);
  30. return $this->arr[$this->position];
  31. }
  32.  
  33. // 5、把数组指针往下移
  34. public function next()
  35. {
  36. // TODO: Implement next() method.
  37. var_dump(__METHOD__);
  38. ++$this->position;
  39. }
  40.  
  41. // 4、返回当前值的下标, 返回键名
  42. public function key()
  43. {
  44. // TODO: Implement key() method.
  45. var_dump(__METHOD__);
  46. return $this->position;
  47. }
  48.  
  49. // 2、验证下标的值是否存在,存在则继续往下走 返回布尔值
  50. public function valid()
  51. {
  52. // TODO: Implement valid() method.
  53. var_dump(__METHOD__);
  54. return isset($this->arr[$this->position]);
  55. }
  56.  
  57. // 1、重置数组的指针
  58. public function rewind()
  59. {
  60. // TODO: Implement rewind() method.
  61. var_dump(__METHOD__);
  62. }
  63.  
  64. }
  65. $data = ['tom', 18, 'man'];
  66. $my = new MyIterator($data);
  67. echo '<pre>';
  68. foreach ($my as $k => $v){
  69. echo '<b>'.$k. ' => '.$v. '</b> ';
  70. }
  71.  
  72. 运行:
  1. string(18) "MyIterator::rewind"
  2. string(17) "MyIterator::valid"
  3. string(19) "MyIterator::current"
  4. string(15) "MyIterator::key"
  5. 0 => tom string(16) "MyIterator::next"
  6. string(17) "MyIterator::valid"
  7. string(19) "MyIterator::current"
  8. string(15) "MyIterator::key"
  9. 1 => 18 string(16) "MyIterator::next"
  10. string(17) "MyIterator::valid"
  11. string(19) "MyIterator::current"
  12. string(15) "MyIterator::key"
  13. 2 => man string(16) "MyIterator::next"
  14. string(17) "MyIterator::valid"
  1.  

SPL之Iterator(迭代器)接口的更多相关文章

  1. ES6笔记(6)-- Set、Map结构和Iterator迭代器

    系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...

  2. java基础(18):集合、Iterator迭代器、增强for循环、泛型

    1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数 ...

  3. Collection接口【集合】和Iterator迭代器类

    1.1集合的概述 前面基础学习并使用过集合ArrayList<E>,那么集合究竟是什么呢? 集合:集合是Java中提供的一种容器,可以用来存储多个数据. 那么意思就是说集合是容器,但是容器 ...

  4. Java—包装类/System类/Math类/Arrays类/大数据运算/Collection接口/Iterator迭代器

    基本类型包装类 8种基本类型对应的包装类如: 将字符串转成基本类型: 将基本数值转成字符串有3种方式: 基本类型直接与””相连接即可:34+" " 调用String的valueOf ...

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

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

  6. 【转】Java学习之Iterator(迭代器)的一般用法 (转)

    [转]Java学习之Iterator(迭代器)的一般用法 (转) 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭 ...

  7. C#:iterator 迭代器/partial class 分布类/泛型

    C#:iterator 迭代器/partial class 分布类/泛型 iterator 迭代器 写个最简单的迭代,(迭代一个字符串数组): 1.实现接口中的方法: 1 using System; ...

  8. [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  9. Collection<E>、Iterable<T>和Iterator<E>接口

    Collection接口 public interface Collection<E>extends Iterable<E> Collection接口主要包含以下方法: Ite ...

  10. [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

随机推荐

  1. P3899 [湖南集训]谈笑风生

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3653 https://www.luogu.org/problemnew/show/P38 ...

  2. SpringBoot 读取properties配置文件 @Value使用 中文乱码问题

    一,idea中配置文件中文乱码问题 使用idea开发,读取properites配置文件 配置: #app 菜单 #没有限制,所有人都可访问的菜单 menu.unlimited=订单审批,现场尽调,合作 ...

  3. (转)tomcat架构&session共享

    (二期)16.tomcat的整体架构与session共享方案 [课程16]tomcat...共享.xmind47.6KB [课程16]tomcat...流程.xmind0.6MB [课程16]tomc ...

  4. P2633 Count on a tree

    思路 运用树上差分的思想,转化成一个普通的主席树模型即可求解 代码 #include <cstdio> #include <algorithm> #include <cs ...

  5. Component 初识组件

    component组件是Vue学习的重点.重点.重点,重要的事情说三遍.所以你必须学好Vue component.其实组件就是制作自定义的标签,这些标签在HTML中是没有的.比如:<diy> ...

  6. (转载)c# winform 窗体起始位置 设置

    窗体起始位置为顶部中间,WinForm居中显示: ; ; this.StartPosition = FormStartPosition.Manual; //窗体的位置由Location属性决定 thi ...

  7. .Net Core Package lose or not match

    错误.警告的说明: 示例一: 严重性:警告 代码:MSB3106 说明 :程序集强名称“C:\Users\$(computerName)\.nuget\packages\$(packageName)\ ...

  8. 无法获取未定义或 null 引用的属性“contentWindow”

    在iframe 中有时候 这样使用contentWindow 会报   无法获取未定义或 null 引用的属性“contentWindow”   这种情况 我是在IE中遇到 其他浏览器一切正常. pa ...

  9. linux中date命令显示

    1. date用来显示具体的日期和24进制的时间 [jasmine.qian@ ~]$ date Fri Jan 25 14:17:17 CST 2019 [jasmine.qian@ ~]$ dat ...

  10. [转][linux]简单的linux下的tcp/udp

    转自:https://blog.csdn.net/cabing2005/article/details/53068880 详细函数以及参数解释请看原链接. windows下的tcp/udp参考:htt ...