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 相关文章推荐
基于empty函数的输出详解
Jun 17 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
十个PHP高级应用技巧果断收藏
Sep 25 PHP
SSO单点登录的PHP实现方法(Laravel框架)
Mar 23 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
php中__toString()方法用法示例
Dec 07 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
laravel config文件配置全局变量的例子
Oct 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
zend framework多模块多布局配置
2011/02/26 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
Yii框架上传图片用法总结
2016/03/28 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
大学生的四年学习自我评价
2013/12/13 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
仓库规划计划书
2014/04/28 职场文书
中秋节感想
2015/08/10 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
python 离散点图画法的实现
2022/04/01 Python