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-10-21 18:32:07

PHP实现迭代器的相关文章

JS代码实例:遍历数组成员的迭代器

文章简介:实现一个遍历数组或对象里所有成员的迭代器. 实现一个遍历数组或对象里所有成员的迭代器. var each = function(obj, fn){         //+++++++++++答题区域+++++++++++                   //+++++++++++答题结束+++++++++++ };  try{                  var data1 = [4,5,6,7,8,9,10,11,12];         var data2 = {    

用PHP迭代器来实现一个斐波纳契数列

斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解的. <?php /* *@author nicesunboy@gmail.com */ class Fibonacci implements Iterator { private $previous = 1; private $current = 0; private $key = 0; publ

PHP设计模式之迭代器模式

迭代器:迭代器设计模式可帮助构造特定对象, 那些对象能够提供单一标准接口循环或迭代任何类型的可计数数据. 处理需要遍历的可计数数据时, 最佳的解决办法是创建一个基于迭代器设计模式的对象. <?php    class CD {                public $band  = "";        public $title = "";        public $trackList = array();                publi

C# 2.0 Specification(迭代器)(一)

22迭代器22.1迭代器块迭代器块就是产生值的有序序列的语句块.迭代器块通过一个或多个yield语句区别于常规语句块. l yield return 语句产生迭代的下一个值. l yield break 语句指明迭代完成. 迭代器块可以被用作一个方法体(method-body).运算符体(operator-body).访问器体(accessor-body),前提是对应函数成员的返回类型是枚举器(enumerator)接口之一或者可枚举(enumerable)接口之一. 迭代器块在C#语法中不什么

C# 2.0 Specification(迭代器)(二)

22.4 yield 语句yield语句用于迭代器块以产生一个枚举器对象值,或表明迭代的结束. embedded-statement:(嵌入语句)...yield-statement(yield语句) yield-statement:(yield 语句)yield return expression ;yield break ; 为了确保和现存程序的兼容性,yield并不是一个保留字,并且 yield只有在紧邻return或break关键词之前才具有特别的意义.而在其他上下文中,它可以被用作标识

C#2.0语言规范(四)迭代器

规范 4.1 迭代器块 一个迭代器块(iterator block)是一个能够产生有序的值序列的块.迭代器块和普通语句块的区别就是其中出现的一个或多个yield语句. yield return语句产生迭代的下一个值. yield break语句表示迭代完成. 只要相应的函数成员的返回值类型是一个枚举器接口(见4.1.1)或是一个可枚举接口(见4.1.2),一个迭代器块就可以用作方法体.运算符体或访问器体. 迭代器块并不是C#语法中的独立元素.它们受多种因素的制约,并且对函数成员声明的语义有很大影

C++中const 与 迭代器(iterator) 使用 详解

迭代器(iterator) 是一种指针类型, 也分const指针本身(地址) 和 const指针所指的值, 两种情况; 但是写法和const内置指针有所不同; char * const 相当于 const container<>::iterator; 可以修改指针所指的值, 但不能修改指针的地址; const char * 相当于 container<>::const_iterator; 可以修改指针地址, 但不能修改指针所指的值; 注意代码示例, 两种const和迭代器; 代码:

C++中正则表达式(regex) 迭代器(iterator) 详解

正则表达式(regex), 使用boost的regex头文件, 是C++11的新标准, 但是gcc4.8.1并未完全支持, 所以使用boost库; 具体安装: http://blog.csdn.net/caroline_wendy/article/details/17282187 正则表达式的书写规范, 以ECMAScript为例, 使用迭代器可以遍历原字符串, 输出符合要求的所有字符串; 使用prefix()和suffix()方法, 可以输出前一个未匹配的字符串和后一个未匹配的字符串; 正则表

传统设计模式(九)迭代器模式

关于迭代器模式,我们所需要知道的第一件事情就是它依赖于一个名为迭代器的接口.一旦我们有了这个接口,就可以为各种那个对象集合实现迭代器:数组.列表.散列表. 项目实例我们就拿用户角色模块来举例 背景 1.某用户作为应用管理员获取一组关于管理角色的arraylist权限组 2.该用户作为应用开发者获取一组关于开发角色的数组形式的权限组 ... /// <summary> /// 迭代器接口 /// </summary> public interface RoleIterator { /

C++容器与迭代器

* 容器的迭代器还有几种: + iterator:正常迭代器(常用) + reverse_iterator:反向迭代器(有时也用) - rbegin(),rend()//返回反向迭 代器 + const_iterator:常量迭代器 + const_reverse_iterator: iterator find(数据){ for( 从beg;!=end;it ++) if(*it==数据) return it; return end;//未找到,返回无效迭代器 }//查询 *it = new_d