当前位置:首页 > CMS教程 > 其它CMS > 列表

PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-02 09:54:50 浏览: 评论:0 

本文实例讲述了PHP中迭代器的简单实现及Yii框架中的迭代器实现方法,分享给大家供大家参考,具体如下:

在维基百科中我们可以看到其定义如下:

迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。

各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。

Iterator另一方面还可以整合Generator,有些语言将二者视为同一接口,有些语言则将之独立化。

地址:http://zh.wikipedia.org/zh-cn/%E8%BF%AD%E4%BB%A3%E5%99%A8

【Iterator的简单实现】

  1. /** 
  2. * Iterator模式的简单实现类 
  3. */ 
  4. class sample implements Iterator { 
  5.   private $_items ; 
  6.    
  7.   public function __construct(&$data) { 
  8.     $this->_items = $data
  9.   } 
  10.   public function current() { 
  11.     return current($this->_items); 
  12.   } 
  13.    
  14.   public function next() { 
  15.     next($this->_items);   
  16.   } 
  17.    
  18.   public function key() { 
  19.     return key($this->_items); 
  20.   } 
  21.    
  22.   public function rewind() { 
  23.     reset($this->_items); 
  24.   } 
  25.    
  26.   public function valid() { 
  27.     return ($this->current() !== FALSE); 
  28.   } 
  29.    
  30. /** DEMO */ 
  31. $data = array(1, 2, 3, 4, 5); 
  32. $sa = new sample($data); 
  33. foreach ($sa AS $key => $row) { 
  34.   echo $key' '$row'<br />'

在next()方法的实现时有过纠结,一直以为这里需要返回下一个的值,

这是因为一直以为这里的next就是next函数的实现,但是非也

在手册中我们可以看到其定义为

abstract public void Iterator::next ( void )

其返回值类型为void

所以这里我们调用next函数就可以了,没有必要返回

另外,以上实现对于如下的数组是存在的问题

$data = array('0' => 11, "" => 22, 's3' => 33, 0, 0, "", false, 0, 1);

运行结果是输出:

  1. 0 11 
  2. 22 
  3. s3 33 
  4. 1 0 
  5. 2 0 

false后面的值就没有迭代显示出来了,具体原因还不清楚,留作下回分解

在yii框架中也有实现迭代器,它的实现避免了这个问题。

【Yii框架中的迭代器实现】

在Yii框架中的我们可以看到其迭代器的实现

在collections目录下的CMapIterator.php文件中,其实现如下:

  1. class CMapIterator implements Iterator { 
  2. /** 
  3. * @var array the data to be iterated through 
  4. */ 
  5.   private $_d
  6. /** 
  7. * @var array list of keys in the map 
  8. */ 
  9.   private $_keys
  10. /** 
  11. * @var mixed current key 
  12. */ 
  13.   private $_key
  14.    
  15. /** 
  16. * Constructor. 
  17. * @param array the data to be iterated through 
  18. */ 
  19.   public function __construct(&$data) { 
  20.     $this->_d=&$data
  21.     $this->_keys=array_keys($data); 
  22.   } 
  23.    
  24. /** 
  25. * Rewinds internal array pointer. 
  26. * This method is required by the interface Iterator. 
  27. */ 
  28.   public function rewind() {                                          
  29.     $this->_key=reset($this->_keys); 
  30.   } 
  31.    
  32. /** 
  33. * Returns the key of the current array element. 
  34. * This method is required by the interface Iterator. 
  35. * @return mixed the key of the current array element 
  36. */ 
  37.   public function key() { 
  38.     return $this->_key; 
  39.   } 
  40.    
  41. /** 
  42. * Returns the current array element. 
  43. * This method is required by the interface Iterator. 
  44. * @return mixed the current array element 
  45. */ 
  46.   public function current() { 
  47.     return $this->_d[$this->_key]; 
  48.   } 
  49.    
  50. /** 
  51. * Moves the internal pointer to the next array element. 
  52. * This method is required by the interface Iterator. 
  53. */ 
  54.   public function next() { 
  55.     $this->_key=next($this->_keys); 
  56.   } 
  57.    
  58. /** 
  59. * Returns whether there is an element at current position. 
  60. * This method is required by the interface Iterator. 
  61. * @return boolean 
  62. */ 
  63.   public function valid() { 
  64.     return $this->_key!==false; 
  65.   } 
  66.    
  67. $data = array('s1' => 11, 's2' => 22, 's3' => 33); 
  68. $it = new CMapIterator($data); 
  69. foreach ($it as $row) { 
  70.   echo $row'<br />'

这与之前的简单实现相比,其位置的变化是通过控制key来实现的,这种实现的作用是为了避免false作为数组值时无法迭代。

Tags: PHP迭代器 Yii迭代器

分享到: