PHP数据结构预热:PHP的迭代器(转)
迭代器有时又称光标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如list或vector)上遍访的接口,设计人员无需关心容器物件的内容。
各种语言实作Iterator的方式皆不尽同,有些面向对象语言像Java, C#, Python, Delphi都已将Iterator的特性内建语言当中,完美的跟语言整合,我们称之隐式迭代器(implicit iterator),但像是C++语言本身就没有Iterator的特色,但STL仍利用template实作了功能强大的iterator。
PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT,否则就是ZEND_ITER_PLAIN_OBJECT.
对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach.
而对于ZEND_ITER_OBJECT的类对象,则会通过调用对象实现的Iterator接口相关函数来进行foreach。
01
|
<?php
|
02
|
03
|
/**
|
04
|
* Iterator模式的简单实现类
|
05
|
*/
|
06
|
class sample implements Iterator {
|
07
|
private $_items ;
|
08
|
|
09
|
public function __construct(& $data ) {
|
10
|
$this ->_items = $data ;
|
11
|
}
|
12
|
public function current() {
|
13
|
return current( $this ->_items);
|
14
|
}
|
15
|
|
16
|
public function next() {
|
17
|
next( $this ->_items);
|
18
|
}
|
19
|
|
20
|
public function key() {
|
21
|
return key( $this ->_items);
|
22
|
}
|
23
|
|
24
|
public function rewind () {
|
25
|
reset( $this ->_items);
|
26
|
}
|
27
|
|
28
|
public function valid() {
|
29
|
return ( $this ->current() !== FALSE);
|
30
|
}
|
31
|
}
|
32
|
|
33
|
/** DEMO */
|
34
|
$data = array (1, 2, 3, 4, 5);
|
35
|
$sa = new sample( $data );
|
36
|
foreach ( $sa AS $key => $row ) {
|
37
|
echo $key , ' ' , $row , '<br />' ;
|
38
|
}
|
39
|
40
|
?>
|
举几个迭代器的使用范围:
- 使用返回迭代器的包或库时(如PHP5中的SPL迭代器)
- 无法在一次的调用获取容器的所有元素时
- 要处理数量巨大的无素时(数据库中的表以GB计的数据)
- ……
不同的迭代器有不同的接口,例如PHP SPL迭代器中包括Next()(移动到下一个元素),corrent()(返回当前元素),valid()(检查迭代结尾),rewind()(从头重新开始),key()(返回当前元素的索引)。当然你可以自己写适合自己用的迭代器,也可以用系统中的迭代器。
一般是使用foreach来使用迭代器,下面整理了一下代码:
01
|
<?php
|
02
|
class sample implements Iterator
|
03
|
{
|
04
|
private $_items = array (1,2,3,4,5,6,7);
|
05
|
|
06
|
public function __construct() {
|
07
|
; //void
|
08
|
}
|
09
|
public function rewind () { reset( $this ->_items); }
|
10
|
public function current() { return current( $this ->_items); }
|
11
|
public function key() { return key( $this ->_items); }
|
12
|
public function next() { return next( $this ->_items); }
|
13
|
public function valid() { return ( $this ->current() !== false ); }
|
14
|
}
|
15
|
|
16
|
$sa = new sample();
|
17
|
foreach ( $sa as $key => $val ){
|
18
|
print $key . "=>" . $val ;
|
19
|
}
|
20
|
?>
|
while循环也可以:
1
|
<?php
|
2
|
while ( $itertor ->valid()){ //判断是不是最后元素
|
3
|
$element = $itertor ->current(); //获取当前元素
|
4
|
$itertor ->next(); //移动到下一个元素
|
5
|
}
|
6
|
?>
|
为什么要学习PHP的迭代器呢?有个很重要的原因:利用PHP的迭代器可以利用面向对象实现常见的数据结构,例如列表,堆栈,队列与图。后面会做一个专题,用PHP实现大部分的数据结构,而且以面向对象的形式。所以这里先预热了一下PHP的迭代器。
转载于:https://www.cnblogs.com/xingmeng/p/3223162.html
PHP数据结构预热:PHP的迭代器(转)相关推荐
- boost一些常用库(数据结构,迭代器,算法及字符串) 简单介绍
原文地址:http://blog.csdn.net/jinzhuojun/article/details/51923337 C++强大的重要原因之一就是它的库.而boost就是这样一个包罗万象的C++ ...
- 怎么确定迭代器后面还有至少两个值_JS Lazy evaluation:可迭代对象与迭代器
本文已经过原作者 MelkorNemesis 授权翻译. Lazy evaluation Lazy evaluation常被译为"延迟计算"或"惰性计算",指的 ...
- STL容器底层数据结构的实现
C++ STL 的实现: 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层 ...
- C++的迭代器Interator
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com STL视频教 ...
- 17.Rust中函数式语言功能:迭代器与闭包
Rust 的设计灵感来源于很多现存的语言和技术.其中一个显著的影响就是 函数式编程(functional programming).函数式编程风格通常包含将函数作为参数值或其他函数的返回值.将函数赋值 ...
- ES6(迭代器、Set、Map、数组去重)
目录 迭代器Iterator Iterator 的作用 原生具备 Iterator 接口的数据结构 Iterator 的遍历过程 迭代器实现了Iterator接口,只要实现了Iterator就可以使用 ...
- 数据结构与算法----问答2023
1.什么是哈希表?如何解决碰撞? 哈希表(Hash Table),也称为散列表,是一种用于实现字典(键值对)数据结构的数据结构.它将键映射到哈希表中的一个索引(桶)来保存值.哈希表的主要优势在于它的查 ...
- 设计模式详解(二十)——迭代器模式
一.场景问题 在激烈的市场竞争中,为了提高自己的硬实力,A公司和B公司决定合并.现在目前二者的员工信息都存放在不同的数据库中,且存储的方式不同,请设计出统一的读取所有员工(A.B公司之和)信息的接口. ...
- mysql adduser_SQL创建登陆用户和赋予权限
js 封装设计cookie http://www.imooc.com/article/12700/p> bzoj 3033 太鼓达人 思路:首先一定是2^m次方的总数.用二进制从 000 一直到 ...
最新文章
- linux sftp权限设置,Linux设置SFTP服务用户目录权限
- 一行命令实现录屏,支持热键和鼠标操作,区域、帧率、格式任你选择
- B-树的插入、查找、删除
- ERP员工入登记查询(六)
- C#的Socket-UDP通信
- Mysql(1)——服务端与客户端建立连接
- Java学习笔记50:JSONObject与JSONArray的使用
- 苹果7手机严重卡顿_为什么苹果手机运存那么小,却不会卡顿?而安卓却不行!长知识了...
- 技术脱钩后软硬件磨合优化不失为一条出路
- python工控怎么样_搞工控不了解python,好比雄鹰断了翅膀,理由在这里!
- Hibernate笔记2
- SharePoint Framework 企业向导(六)
- 程序员面试宝典(一) - 流程概览
- Ubuntu安装显卡驱动
- python识别手写文字_python实现ocr-手写体识别
- 【小程序源码】超强大的头像制作神器微信小程序源码
- 计算机最小系统法的安装流程,最简单的系统安装步骤
- file:/usr/local/hive/iotmp/89de7dfe-8f26-4a6e-87b4-bacd16c2b2c8/hive_2021-11-05_05-06-07_555_3392062
- avenue css,CSS构建的平面建筑布局图
- 第一个HTML页面如何写?—零基础自学网页制作