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


Posted in PHP onApril 26, 2020

本文实例讲述了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的简单实现】

/**
* Iterator模式的简单实现类
*/
class sample implements Iterator {
  private $_items ;
 
  public function __construct(&$data) {
    $this->_items = $data;
  }
  public function current() {
    return current($this->_items);
  }
 
  public function next() {
    next($this->_items);  
  }
 
  public function key() {
    return key($this->_items);
  }
 
  public function rewind() {
    reset($this->_items);
  }
 
  public function valid() {
    return ($this->current() !== FALSE);
  }
}
 
/** DEMO */
$data = array(1, 2, 3, 4, 5);
$sa = new sample($data);
foreach ($sa AS $key => $row) {
  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);

运行结果是输出:

0 11
22
s3 33
1 0
2 0
3

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

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

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

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

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

class CMapIterator implements Iterator {
/**
* @var array the data to be iterated through
*/
  private $_d;
/**
* @var array list of keys in the map
*/
  private $_keys;
/**
* @var mixed current key
*/
  private $_key;
 
/**
* Constructor.
* @param array the data to be iterated through
*/
  public function __construct(&$data) {
    $this->_d=&$data;
    $this->_keys=array_keys($data);
  }
 
/**
* Rewinds internal array pointer.
* This method is required by the interface Iterator.
*/
  public function rewind() {                                         
    $this->_key=reset($this->_keys);
  }
 
/**
* Returns the key of the current array element.
* This method is required by the interface Iterator.
* @return mixed the key of the current array element
*/
  public function key() {
    return $this->_key;
  }
 
/**
* Returns the current array element.
* This method is required by the interface Iterator.
* @return mixed the current array element
*/
  public function current() {
    return $this->_d[$this->_key];
  }
 
/**
* Moves the internal pointer to the next array element.
* This method is required by the interface Iterator.
*/
  public function next() {
    $this->_key=next($this->_keys);
  }
 
/**
* Returns whether there is an element at current position.
* This method is required by the interface Iterator.
* @return boolean
*/
  public function valid() {
    return $this->_key!==false;
  }
}
 
$data = array('s1' => 11, 's2' => 22, 's3' => 33);
$it = new CMapIterator($data);
foreach ($it as $row) {
  echo $row, '<br />';
}

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

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP开发文件系统实例讲解
Oct 09 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
Aug 21 PHP
PHP中英混合字符串截取函数代码
Jul 17 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
Oct 14 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
php查看当前Session的ID实例
Mar 16 PHP
深入php内核之php in array
Nov 10 PHP
PHP编写RESTful接口的方法
Feb 21 PHP
php实现图片缩略图的方法
Mar 29 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
Apr 19 PHP
PHP智能识别收货地址信息实例
Jan 05 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 #PHP
Yii Framework框架开发微信公众平台示例
Apr 26 #PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 #PHP
PHP过滤器 filter_has_var() 函数用法实例分析
Apr 23 #PHP
PHP优化之批量操作MySQL实例分析
Apr 23 #PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 #PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
Apr 23 #PHP
You might like
第十二节--类的自动加载
2006/11/16 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
语义化 H1 标签
2008/01/14 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
jquery仿搜索自动联想功能代码
2014/05/23 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
理解javascript模块化
2016/03/28 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
Python的print用法示例
2014/02/11 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
财政局长自荐信范文
2013/12/22 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
大学四年个人自我小结
2014/03/05 职场文书
教师见习报告范文
2014/11/03 职场文书
介绍信怎么写
2015/01/30 职场文书
初中政治教师教学反思
2016/02/23 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
Python合并多张图片成PDF
2021/06/09 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫