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中Date获取时间不正确怎么办
Jun 05 PHP
一道关于php变量引用的面试题
Aug 08 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
PHP多例模式介绍
Jun 24 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
php中HTTP_REFERER函数用法实例
Nov 21 PHP
PHP中把对象转换为关联数组代码分享
Apr 09 PHP
PHP错误Warning:mysql_query()解决方法
Oct 24 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
Laravel5权限管理方法详解
Jul 26 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
php + WebUploader实现图片批量上传功能
May 06 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
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
JS 继承实例分析
2008/11/04 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python制作websocket服务器实例分享
2016/11/20 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
Python语言的变量认识及操作方法
2018/02/11 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
经济职业学院毕业生自荐书
2014/03/17 职场文书
高中社区服务活动报告
2015/02/05 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
在校证明模板
2015/06/17 职场文书
公司回复函格式
2015/07/14 职场文书
感恩教师主题班会
2015/08/12 职场文书
给学校的建议书400字
2015/09/14 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Android studio 简单计算器的编写
2022/05/20 Java/Android