php 迭代器

迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。

百度百科: http://baike.baidu.com/view/9791023.htm?fr=aladdin

解释

上面这名话可能多数人看得似懂非懂,什么叫做访问容器的各个元素,又不暴露对象的内部细节呢?尤其是网上很多例子都过于简单,直接扔一个数组,然后去实现了迭代器的各种方法,如下:

<?php

class SomeCollection implements Iterator

{

protected $_data;

protected $_pos;

function __construct($data)

{

$this->_data = $data;

$this->_pos = 0;

}

function current()

{

$row = $this->_data[$this->_pos];

return $row;

}

function next()

{

$this->_pos++;

}

function valid()

{

return $this->_pos >= 0 && $this->_pos <count($this->_data);

}

function key()

{

return $this->_pos;

}

function rewind()

{

$this->_pos = 0;

}

}

$array = array(

array(‘url‘ => ‘www.zeroplace.cn‘),

array(‘url‘ => ‘www.baidu.com‘),

array(‘url‘ => ‘www.sina.com.cn‘),

array(‘url‘ => ‘www.google.com‘),

array(‘url‘ => ‘www.qq.com‘),

);

$coll = new SomeCollection($array);

foreach ($coll as $row) {

echo $row[‘url‘], "\n";

}

这样的例子就不能够说明迭代器的作用,因为它不能说明迭代器隐藏了内部的数据结构,传进去的和返回出来的完全是一样的数据。

迭代器怎么用

我只能说在不同的场合有不同的用法。比如我把上面的例子修改一下,可能就可以说明迭代器可以隐藏数据结构这个特性了。请看如下代码。

<?php

class SomeCollection implements Iterator

{

protected $_data;

protected $_pos;

function __construct($data)

{

$this->_data = $data;

$this->_pos = 0;

}

function current()

{

$row = $this->_data[$this->_pos];

$row[‘ip‘] = gethostbyname($row[‘url‘]);

return $row;

}

function next()

{

$this->_pos++;

}

function valid()

{

return $this->_pos >= 0 && $this->_pos <count($this->_data);

}

function key()

{

return $this->_pos;

}

function rewind()

{

$this->_pos = 0;

}

}

$array = array(

array(‘url‘ => ‘www.zeroplace.cn‘),

array(‘url‘ => ‘www.baidu.com‘),

array(‘url‘ => ‘www.sina.com.cn‘),

array(‘url‘ => ‘www.google.com‘),

array(‘url‘ => ‘www.qq.com‘),

);

$coll = new SomeCollection($array);

foreach ($coll as $row) {

echo $row[‘url‘], ‘ ‘,  $row[‘ip‘], "\n";

}

这样我觉得就可以说明迭代器能隐藏数据结构这个特性了。我们的数据传进去的时候每行数据只有一个url属性,但是迭代出来的时候多了一个ip属性。这样对外部的使用者来说就是有两个属性(url和ip), 它不需要知道这个ip字段是创建者传入的还是在迭代器中产生的。

更一般的做法

这里current方法返回的是一个关联数组,更常规的做法是返回一个对象,此时这个迭代器可能还需要一个对象创建器。

时间: 2024-10-31 23:44:07

php 迭代器的相关文章

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

装饰器、生成器、迭代器

装饰器的前奏 装饰器:本质是函数 功能:就是装饰成其他函数  就是为其他函数添加附加功能的 高阶函数+嵌套函数=装饰器 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 总结一句话:装饰器对被装饰的函数是完全透明的 实现装饰器的只是储备: 1.函数名即"变量"   将函数体赋值给变量   和内存回收机制一样 2.高阶函数 2.1.把函数名作为实参传递给形参(可返回被修饰函数的地址)(不修改源代码的情况可添加新的功能) 2.2返回值中包含函数地址(不修改函数的调

Vector容器 和 iteration 迭代器

vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库负责管理存储元素的相关内存.我们把vector称为容器,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的. 使用vector之前,必须包含相应的头文件.#include <vector> using std::vector; vector是一个类模板(class template).模板允许程序员编写单个类或函数定义,这个类和函数定义可用于不同的数据类型上.

Python高级特性:迭代器和生成器 -转

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = False   def check_log(func): def inner(): res = func() if LOGIN_INFO: print('验证成功!') return res else: print('验证失败!') return inner   def check_admin(func)

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

迭代器

创建迭代器最常用的方法是对IEnumerator接口实现GetEnumerator方法. public class Family : System.Collections.IEnumerable { string[] myFamily = {“父亲”,”母亲”,”弟弟”,”妹妹”}; public System.Collections.IEnumerator GetEnumerator() { for(int i=0;i<myFamily.Length;i++) { yield return m

LeetCode OJ:Peeking Iterator(peeking 迭代器)

Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next(). Here is an exampl

JavaScript设计模式 - 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 许多浏览器都支持 Javascript 的 Array.prototype.forEach 迭代器可以分为 内部迭代器 和 外部迭代器 一.jQuery 中的迭代器 1 $.each( [1,2,3,4], function (i, n) { 2 console.log( "当

Java基础知识强化之集合框架笔记11:Collection集合之迭代器的原理及源码解析

1. 迭代器为什么不定义成一个类,而是定义为一个接口 ?  答:假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历.但是呢? 我们想想,Java中提供了很多的集合类,而这些集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不同的.进而它们的遍历方式也应该不是一样的,最终,就没有定义迭代器类.        而无论你是哪种集合,你都应该具备获取元素的操作,而且,最好在辅助于判断功能,这样,在获取前,先判断.这样的话就不容易出错.也就是说,判断功能和获取