php中的迭代器

<?php
class myIterator implements Iterator {
    private $position = 0;
    private $array = array(
        "firstelement",
        "secondelement",
        "lastelement",
    );  

    public function __construct() {
        $this->position = 0;
    }

    function rewind() {
       var_dump(__METHOD__);
        $this->position = 0;
    }

    function current() {
       var_dump(__METHOD__);
        return ‘one_‘ . $this->array[$this->position] . ‘_two‘;
    }

    function key() {
       var_dump(__METHOD__);
        return $this->position;
    }

    function next() {
        var_dump(__METHOD__);
        ++$this->position;
    }

    function valid() {
        var_dump(__METHOD__);
        return isset($this->array[$this->position]);
    }

}

$it = new myIterator;

foreach($it as $key => $value) {
    //var_dump($key,$value);
    echo $value;
    echo "\n";
}

从上面的执行结果看,迭代器的工作流程是这样的:
    1.首先指向数组首
    2.判断是否有效
    3.获取当前值
    4.获取当前key
    5.进入循环,进行当前指针加一操作
    6.判断是否有效(无效停止)
    7.获取当前值
    8.获取当前key
    9.重复5步骤

为什么要使用迭代器?
    该示例中,是用对象做了封装,简化了foreach语句的复杂程度,或是专注于流程,而细节则交给迭代器。
    迭代器它本身的实现都是通过C拓展的,所以自己编写的遍历和PHP自身提供的迭代器是有性能的差异第二个,因为遍历的是对象而不是数组,免不了我们在遍历的时候遇到不少麻烦,即使我们解决了,也不能确保我们应用到的算法是最好的

时间: 2024-10-08 22:02:36

php中的迭代器的相关文章

集合 java中的迭代器

今天学习了 集合,但是感觉对于迭代器不是 很明白,所以研究了一下! 在 JDK中 Collection作为集合的顶级容器, 她实现了Java.lang.Iterable  接口! Iterable:  可迭代的, 想使用迭代功能的容器必须实现这个顶级接口,中的 iterator() 方法. Iterator:迭代器. 每个容器的内部都有不同的迭代器实现.抽取出她们的共性,我们抽取出 Iterator 接口. 我们查看源码 Iterator: public interface Iterator<E

ES6中的迭代器(Iterator)和生成器(Generator)

前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与Map集合)都依赖迭代器的实现,这个新特性对于高效的数据处理而言是不可或缺的,在语言的其他特性中也都有迭代器的身影:新的for-of循环.展开运算符(...),甚至连异步编程都可以使用迭代器 本文将详细介

C++中的迭代器

C++STL中的迭代器 "指针"对所有C/C++的程序员来说,一点都不陌生.在接触到C语言中的malloc函数和C++中的new函数后,我们也知道这两个函数返回的都是一个指针,该指针指向我们所申请的一个"堆".提到"堆",就不得不想到"栈",从C/C++程序设计的角度思考,"堆"和"栈"最大的区别是"栈"由系统自动分配并且自动回收,而"堆"则是由程

python中的迭代器和生成器

迭代:就是重复做一些事情很多次,使用__iter__方法,迭代器就是具有next方法的对象 内建函数iter可以从可迭代的对象中获得迭代器 从迭代器得到序列: 在if self.value>10中只能使用引发异常,不能使用break,不然有会报语法错误 从迭代器中得到序列我的理解为就是在满足条件之前就是将重复做过的值列出来. 生成器: 先展开嵌套列表中的子列表,然后再展开子列表中的元素. 任何包含yield语句的函数都称为生成器 处理多层未知的嵌套的情况:

一步一步认识C++STL中的迭代器

一步一步认识C++STL中的迭代器 "指针"对所有C/C++的程序员来说,一点都不陌生.在接触到C语言中的malloc函数和C++中的new函数后,我们也知道这两个函数返回的都是一个指针,该指针指向我们所申请的一个"堆".提到"堆",就不得不想到"栈",从C/C++程序设计的角度思考,"堆"和"栈"最大的区别是"栈"由系统自动分配并且自动回收,而"堆&quo

12.1.3 使用 F# 序列表达式 在 C# 中的迭代器非常方便(comfortable),能够在普通的 C# 方法中写复杂的代码 (实现 IEnumerable&lt;T&gt;/IEnumerator

12.1.3 使用 F# 序列表达式 在 C# 中的迭代器非常方便(comfortable),能够在普通的 C# 方法中写复杂的代码(实现 IEnumerable<T>/IEnumerator<T> 接口的类型).开发人员写的代码使用标准的C# 功能,比如环,唯一的改变只是我们可以使用一种新的语句,来做一些非标准的事情,这个新语句用 yield return 表示(或者 yield break 表示终止序列),非标准的行为返回序列中下一个元素的值.在以后需要访问序列的时候(最后,计

ES6中的迭代器(Iterator)和生成器(Generator)(一)

用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与Map集合)都依赖迭代器的实现,这个新特性对于高效的数据处理而言是不可或缺的,在语言的其他特性中也都有迭代器的身影:新的for-of循环.展开运算符(...),甚至连异步编程都可以使用迭代器 一.引入 下面是一段标

lua中的迭代器与泛型for

任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器.lua中常常使用函数来描述迭代器,每次调用该函数都返回集合的下一个元素.每一个迭代器都需要保存一些状态来知道当前处于什么位置和如何进行下一次迭代.对于这样的任务,闭包提供了很好的机制来完成.一个典型的闭包结构包含两个函数:一个是闭包自身,一个是创建闭包的工厂. 例如,我们可以写过简单的list迭代器,让他仅仅返回值. function values( t ) local i = 0; return function() i = i +

23种设计模式中的迭代器模式

迭代器模式:提供一种方法顺序访问一个聚合对象中的各个对象. 那么如何提供一个方法顺序呢? public interface Iterator<T>{ public boolean hasNext(); public T next(); } public class XXX{ private List<XXX> list =new ArrayList<>(); public Iterator getIterator (){ return new XXXIterator()

mapreduce中reduce中的迭代器只能调用一次!

亲测,只能调用一次,如果想想在一次reduce重复使用迭代器中的数据,得先取出来放在list中然后在从list中取出来!!多次读取reduce函数中迭代器的数据 public static class FindFriendReducer extends Reducer<Text, AllInfoBean, AllInfoBean, NullWritable> { protected void reduce(Text Keyin, Iterable<AllInfoBean> valu