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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
php 连接mysql连接被重置的解决方法
Feb 15 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
浅析php中json_encode()和json_decode()
May 25 PHP
php出现web系统多域名登录失败的解决方法
Sep 30 PHP
thinkphp文件引用与分支结构用法实例
Nov 26 PHP
Zend Framework教程之视图组件Zend_View用法详解
Mar 05 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
php的laravel框架快速集成微信登录的方法
Dec 12 PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
Jul 10 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来实现网络服务
2009/09/15 PHP
php数组一对一替换实现代码
2012/08/31 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
jQuery中队列queue()函数的实例教程
2016/05/03 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
Python实现GUI学生信息管理系统
2020/04/05 Python
Django中的Signal代码详解
2018/02/05 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
Python I/O与进程的详细讲解
2019/03/08 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
python编写计算器功能
2019/10/25 Python
pycharm 设置项目的根目录教程
2020/02/12 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
网上书店创业计划书
2014/01/12 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
Python中Permission denied的解决方案
2021/04/02 Python