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
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
通过缓存数据库结果提高PHP性能的原理介绍
Sep 05 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
php 实现进制相互转换
Apr 07 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
PHP中危险的file_put_contents函数详解
Nov 04 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 安全检测代码片段(分享)
2013/07/05 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
js在指定位置增加节点函数insertBefore()用法实例
2015/01/12 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
BootStrap中
2016/12/10 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
详解Django中Request对象的相关用法
2015/07/17 Python
Python 中Pickle库的使用详解
2018/02/24 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
解决使用export_graphviz可视化树报错的问题
2019/08/09 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
如何验证python安装成功
2020/07/06 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
社团活动总结报告
2014/06/27 职场文书
教师工作态度自我评价
2015/03/05 职场文书
运动会100米广播稿
2015/08/19 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
Pandas数据类型之category的用法
2021/06/28 Python
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android