PHP实现迭代器

不多说,对于PHP的新手来说,学习到了。

<?php
/**
 * 迭代器的公用接口
 */
interface NewIterator{
 public function hasNext();
 public function Next();
}

/**
 * 书目的迭代器,实现NewIterator接口
 */
class BookIterator implements NewIterator {
 private $array = array();//记录整个内容
 private $num = 0;//记录索引
 
 public function __construct($_string){
  //因为在我的例子里需要这样处理。
  if (is_array($_string)){
   $this->array = $_string;
  }else{
   $this->array = explode("|",$_string);
  }
 }
 
 public function next(){
  //记录下一项的内容
  $arrayA = $this->array[$this->num];
  //索引增加1
  $this->num = $this->num + 1;
  return $arrayA;
 }
 
 public function hasNext(){
  if($this->num >= count($this->array) || $this->array[$this->num] == null){
   return false;
  }else{
   return true;
  }
 }
}

/**
 * 数目是用数组存储的
 */
class BookA{
 private $bookarray = array();
 
 public function __construct(){
  $this->addItem("深入浅出设计模式");
  $this->addItem("think in java");
  $this->addItem("php手册");
 }
 
 public function addItem($_string){
  $this->bookarray[]=$_string;
 }
 //这里不再返回一个数组。而是一个真正的对象。数组被传递到了迭代器中。实现和书目调用的解耦
 public function getIterator(){
  return new BookIterator($this->bookarray);
 }
}

/**
 * 书目都是用字符串存储的
 */
class BookB{
 private $bookindex="";
 
 public function __construct(){
  $this->addItem("深入浅出设计模式");
  $this->addItem("PHP");
  $this->addItem("think in java");
 }
 
 public function addItem($_string){
  $this->bookindex.="|".$_string;
 }
 
 public function getIterator(){
  return new BookIterator(trim($this->bookindex,"|"));//附带的处理而已
 }
}

/**
 * 输出两个书店的书目
// */
//require "NewIterator.php";
//require ‘BookA.php‘;
//require ‘BookB.php‘;
//require "BookIterator.php";
 
class BookList{
 private $bookarray;
 private $bookstring;
 
 public function __construct(BookA $_booka,BookB $_bookb){
  $this->bookarray = $_booka; 
  $this->bookstring = $_bookb;
  //改装成了只记录对象引用;
 }
 
 public function Menu(){
   $bookaiterator = $this->bookarray->getIterator();
   echo "书店A的书目:"."</br>";
   $this->toString($bookaiterator);
   echo "</br>";
   $bookbiterator = $this->bookstring->getIterator();
   echo "书店B的书目:"."</br>"; 
   $this->toString($bookbiterator);
 }
 public function toString(NewIterator $_iterator){
  while ($_iterator->hasNext()){
   echo $_iterator->Next()."</br>";
  }
 }
}

$booka=new BookA();
$bookb=new BookB();
$a = new BookList($booka,$bookb);
$a->Menu();

?>
时间: 2024-07-31 22:46:11

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中提供了很多的集合类,而这些集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不同的.进而它们的遍历方式也应该不是一样的,最终,就没有定义迭代器类.        而无论你是哪种集合,你都应该具备获取元素的操作,而且,最好在辅助于判断功能,这样,在获取前,先判断.这样的话就不容易出错.也就是说,判断功能和获取