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 相关文章推荐
JAVA/JSP学习系列之七
Oct 09 PHP
php&amp;java(三)
Oct 09 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
关于PHP递归算法和应用方法介绍
Apr 15 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
Dec 09 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 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
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
PHP程序员编程注意事项
2008/04/10 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
Jquery取得iframe下内容的方法
2013/11/18 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
Angular实现响应式表单
2017/08/04 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
Python对列表的操作知识点详解
2019/08/20 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Python自省及反射原理实例详解
2020/07/06 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
采购员岗位职责
2013/11/15 职场文书
好家长事迹材料
2014/01/23 职场文书
中学教师培训制度
2014/01/31 职场文书
《去年的树》教学反思
2014/04/11 职场文书
土木工程求职信
2014/05/29 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
授权委托书公证
2014/09/14 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技