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 相关文章推荐
解决GD中文乱码问题
Feb 14 PHP
隐藏你的.php文件的实现方法
Mar 19 PHP
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
PHP文件操作实现代码分享
Sep 01 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
超小PHP小马小结(方便查找后门的朋友)
May 05 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
php简单处理XML数据的方法示例
May 19 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
Jun 07 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 PHP
php抽象类和接口知识点整理总结
Aug 02 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 23 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图片处理函数获取类型及扩展名实例
2014/11/19 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
Vue前端开发规范整理(推荐)
2018/04/23 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
自荐信的五个重要部分
2013/10/29 职场文书
社区庆八一活动方案
2014/02/02 职场文书
食品安全责任书
2014/04/15 职场文书
运动会口号8字
2014/06/07 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
班组长安全工作职责
2014/07/15 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
归元寺导游词
2015/02/06 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
python实现网络五子棋
2021/04/11 Python
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技