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 相关文章推荐
dedecms后台验证码总提示错误的解决方法
Mar 21 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
PHP中通过fopen()函数访问远程文件示例
Nov 18 PHP
php生成数字字母的验证码图片
Jul 14 PHP
关于PHP内置的字符串处理函数详解
Feb 04 PHP
PHP 类与构造函数解析
Feb 06 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
Dec 05 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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导入导出CSV文件
2014/11/03 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
jquery ajax执行后台方法
2010/03/18 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
javascript  数组排序与对象排序的实例
2017/07/17 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
妇女干部培训方案
2014/05/12 职场文书
大学生村官考核材料
2014/05/23 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
优秀教师推荐材料
2014/12/16 职场文书
生日赠语
2015/06/23 职场文书
证婚人致辞精选
2015/07/28 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
Linux中sftp常用命令整理
2022/06/28 Servers