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 危险函数解释 分析
Apr 22 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 PHP
php接口与接口引用的深入解析
Aug 09 PHP
thinkphp实现面包屑导航(当前位置)例子分享
May 10 PHP
浅析php中json_encode()和json_decode()
May 25 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
PHP批量去除BOM头代码分享
Jun 26 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
ThinkPHP进程计数类Process用法实例详解
Sep 25 PHP
php删除数组中重复元素的方法
Dec 22 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
优化Python代码使其加快作用域内的查找
2015/03/30 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
个人求职简历中英文自我评价
2013/12/16 职场文书
节约电力资源的建议书
2014/03/12 职场文书
《长征》教学反思
2014/04/27 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
团队拓展活动方案
2014/08/28 职场文书
庆祝国庆节标语
2014/10/09 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
python 如何在list中找Topk的数值和索引
2021/05/20 Python
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers