echo "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ";
class Test implements Iterator{
private $list;
private $i=0;
private $valid=false;
public function __construct($array=array()){
$this->list=$array;
}
/**
* 将索引指定到首个元素
* {@inheritDoc}
* @see Iterator::rewind()
*/
function rewind(){
echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';
$this->valid=(false !==reset($this->list));
}
/**
* 返回当前元素
* {@inheritDoc}
* @see Iterator::current()
*/
function current(){
echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';
return current($this->list);
}
/**
* 索引指向下一个元素
* {@inheritDoc}
* @see Iterator::next()
*/
function next(){
echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';
$this->valid=(false !== next($this->list));
}
/**
* 返回当前元素键值
* {@inheritDoc}
* @see Iterator::key()
*/
function key(){
echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>';
return key($this->list);
}
/**
* 判断下个是否有下个元素
* {@inheritDoc}
* @see Iterator::valid()
*/
function valid(){
echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>';
return $this->valid;
}
} $list=array(1,2,3);
$test=new Test($list);
//foreach循环方式
foreach ($test as $key=>$val){
echo '输出索引为'.$key.'的元素值为:'.$val.'<br/><br/>';
} echo '----------------结束分隔线-----------------------<br/>';
$second=new Test($list);
//while循环方式
$second->rewind();
while($second->valid()){
echo '输出索引为'.$second->key().'的元素值为:'.$second->current().'<br/><br/>';
$second->next();
} echo '--------------------结束分隔线----------------------<br/>';

输出格式:

第1步:执行 Test::rewind
第1步:执行 Test::valid
第2步:执行 Test::current
第3步:执行 Test::key
输出索引为0的元素值为:1

第4步:执行 Test::next
第2步:执行 Test::valid
第5步:执行 Test::current
第6步:执行 Test::key
输出索引为1的元素值为:2

第7步:执行 Test::next
第3步:执行 Test::valid
第8步:执行 Test::current
第9步:执行 Test::key
输出索引为2的元素值为:3

第10步:执行 Test::next
第4步:执行 Test::valid
----------------结束分隔线-----------------------
第1步:执行 Test::rewind
第1步:执行 Test::valid
第2步:执行 Test::key
第3步:执行 Test::current
输出索引为0的元素值为:1

第4步:执行 Test::next
第2步:执行 Test::valid
第5步:执行 Test::key
第6步:执行 Test::current
输出索引为1的元素值为:2

第7步:执行 Test::next
第3步:执行 Test::valid
第8步:执行 Test::key
第9步:执行 Test::current
输出索引为2的元素值为:3

第10步:执行 Test::next
第4步:执行 Test::valid
--------------------结束分隔线----------------------
执行到valid返回false时,则循环结束

PHP-Iterator迭代器(遍历)接口详讲的更多相关文章

  1. 56 容器(十)——Iterator迭代器遍历容器

    迭代器的获取 LIst与Set容器统一使用他们的对象.Iterator()方法获得迭代器对象,然后使用while循环配合迭代器的方法hasNext()及next()来遍历容器. List<Str ...

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

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

  3. 有关map中使用iterate迭代器遍历的不保序问题和list remove(object)的细节问题

    今天在做项目的过程中发现了如下两个问题: 一 使用map的iterator迭代器对map进行遍历得到的结果是不保序的,也就是每次输出结果都是不一样的.针对这个问题,看以下iterator迭代器的源码. ...

  4. Java中的Enumeration、Iterable和Iterator接口详解

    前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...

  5. 集合--Collection接口详解&&迭代器

    /* * 集合的顶层接口--Collection接口 * 添加 * add() * addAll() * * 遍历集合 * iterator() 迭代器 * * 删除 * remove() * rem ...

  6. 迭代器:遍历集合元素的操作. iterator()

    package seday11; import java.util.ArrayList;import java.util.Collection;import java.util.Iterator; / ...

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

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

  8. Java集合【2】--iterator接口详解

    目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...

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

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

随机推荐

  1. UESTC 1059 - 秋实大哥与小朋友

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 Time Limit: 3000/1000MS (Java/Others)     Memory Li ...

  2. kubernetes实战(二十):k8s一键部署高可用Prometheus并实现邮件告警

    1.基本概念 本次部署使用的是CoreOS的prometheus-operator. 本次部署包含监控etcd集群. 本次部署适用于二进制和kubeadm安装方式. 本次部署适用于k8s v1.10版 ...

  3. 快捷键(SourceInsight)

    选择一块 : Ctrl+-选择一行 : Shift+F6到下一个函数 : 小键盘 +上一个函数 : 小键盘 -高亮当前单词 : Shift+F8回退.前进 alt + , alt + .最后一个窗口 ...

  4. mysql 内置功能 视图介绍

    之前的多表查询本质是把多张有关系的表连接在一起组成一张虚拟表,从而进行查询 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名], 用户使用时只需使用[名称]即 ...

  5. 【转】 Oracle 用户权限管理方法

    sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最高权限 system;//本地管 ...

  6. [LeetCode] 257. Binary Tree Paths_ Easy tag: DFS

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  7. LeetCode--44 通配符匹配

    题目就是说两个字符串,一个含有通配符,去匹配另一个字符串:输出两个字符串是否一致. 注意:’?’表示匹配任意一个字符,’*’表示匹配任意字符0或者多次 首先,我们想到暴力破解.如果从头到尾的破解,到第 ...

  8. SVN 取消版本控制并添加至忽略列表

    忽略已经版本控制的文件忽略文件和目录 起因: 由于项目中的IDE Jdeveloper在某些指定目录下面会生成server.xml以及common文件夹,且包含一个名为bc4j.xcfg的文件,每次当 ...

  9. C#在splitContainer1控件和panel控件中显示窗体

    现在有两个窗体 Form1 和Form2 Form1中有控件splitContainer1 和panel .控件.我们希望Form2在splitContainer1或者panel控件中显示 1:首先看 ...

  10. pdo sqlserver

    PHP代码如果想要用以上的方式兼容linux服务器和windows服务器,那么大概的示例代码是这样的. <?php header("Content-type: text/html; c ...