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类
Jul 15 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
phpnow php探针环境检测代码
Nov 04 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
php获取远程文件的内容和大小
Nov 03 PHP
PHP 自动加载的简单实现(推荐)
Aug 12 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
PHP通过引用传递参数用法分析
Dec 01 PHP
PHP实现git部署的方法教程
Dec 19 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 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仿QQ验证码的实例分析
2013/07/01 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
javascript打印输出json实例
2013/11/11 Javascript
jQuery的animate函数学习记录
2014/08/08 Javascript
详解javascript函数的参数
2015/11/10 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
安装dbus-python的简要教程
2015/05/05 Python
浅谈Python单向链表的实现
2015/12/24 Python
Python2.x与Python3.x的区别
2016/01/14 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
简单的Python调度器Schedule详解
2019/08/30 Python
python读文件的步骤
2019/10/08 Python
python logging 日志的级别调整方式
2020/02/21 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
别名指示符是什么
2012/10/08 面试题
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
介绍一下Linux文件的记录形式
2013/09/29 面试题
师范生自我鉴定范文
2013/10/05 职场文书
企业为何需要商业计划书
2013/12/26 职场文书
应届毕业生个人求职信范文
2014/01/29 职场文书
远程研修随笔感言
2014/02/10 职场文书
大专毕业生求职信
2014/07/05 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
学生病假条范文
2015/08/17 职场文书
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL