博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP迭代器Iterator接口
阅读量:6582 次
发布时间:2019-06-24

本文共 3096 字,大约阅读时间需要 10 分钟。

介绍

可在内部迭代自己的外部迭代器或类的接口。

1
2
3
4
5
6
7
8
9
10
   
Iterator 
extends 
Traversable
{
    
/* 方法 */
    
abstract 
public 
mixed current(void)
    
abstract 
public 
scalar key(void)
    
abstract 
public 
void next(void)
    
abstract 
public 
void 
rewind
(void )
    
abstract 
public 
boolean valid(void)
}

举个栗子,定义一个迭代器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class 
myIerator 
implements 
Iterator
{
    
protected 
$position
;
//指针
    
public 
$arr 
= [];
 
    
public 
function 
__construct(
array 
$arr
)
    
{
        
$info 
date
(
'Y-m-d H:i:s'
) . 
' ' 
__METHOD__ 
' Line :' 
__LINE__ 
"\r\n"
;
        
$this
->writeLog(
$info
);
        
$this
->arr = 
$arr
;
        
return 
$this
;
    
}
 
    
//获取当前的值
    
public 
function 
current()
    
{
        
$info 
date
(
'Y-m-d H:i:s'
) . 
' ' 
__METHOD__ 
' Line :' 
__LINE__ 
"\r\n"
;
        
$this
->writeLog(
$info
);
        
return 
$this
->arr[
$this
->position] ?? null;
    
}
 
    
//将指针移至下一位
    
public 
function 
next()
    
{
        
$info 
date
(
'Y-m-d H:i:s'
) . 
' ' 
__METHOD__ 
' Line :' 
__LINE__ 
"\r\n"
;
        
$this
->writeLog(
$info
);
        
return 
++
$this
->position;
    
}
 
    
//返回当前的指针
    
public 
function 
key()
    
{
        
$info 
date
(
'Y-m-d H:i:s'
) . 
' ' 
__METHOD__ 
' Line :' 
__LINE__ 
"\r\n"
;
        
$this
->writeLog(
$info
);
        
return 
$this
->position;
    
}
 
 
    
//重置指针
    
public 
function 
rewind
()
    
{
        
$info 
date
(
'Y-m-d H:i:s'
) . 
' ' 
__METHOD__ 
' Line :' 
__LINE__ 
"\r\n"
;
        
$this
->writeLog(
$info
);
        
$this
->position = 0;
    
}
 
    
//检查当前是否有效
    
public 
function 
valid()
    
{
        
$info 
date
(
'Y-m-d H:i:s'
) . 
' ' 
__METHOD__ 
' Line :' 
__LINE__ 
"\r\n"
;
        
$this
->writeLog(
$info
);
        
return 
isset(
$this
->arr[
$this
->position]);
    
}
 
    
private 
function 
writeLog(string 
$info
)
    
{
        
error_log
(
$info
, 3, 
'./debug.log'
);
    
}
}

1
2
3
4
5
$zhangsan
=[
'one'
,
'two'
,
'three'
,
'four'
];
$arr 
new 
myIerator(
$zhangsan
);
foreach 
(
$arr 
as 
$k 
=> 
$v
) {
    
echo 
"{$k} => {$v} \r\n"
;
}

打印结果:

0 => one 

1 => two 
2 => three 
3 => four 
查看调用日志:

2017-11-27 15:56:04 myIerator::__construct Line :16

2017-11-27 15:56:04 myIerator::rewind Line :50    重置指针

2017-11-27 15:56:04 myIerator::valid Line :58        校验是否有效
2017-11-27 15:56:04 myIerator::current Line :25    获取当前指针的值
2017-11-27 15:56:04 myIerator::key Line :41          获取当前指针位置
2017-11-27 15:56:04 myIerator::next Line :33        指针下移一位(进入下一个循环)

2017-11-27 15:56:04 myIerator::valid Line :58

2017-11-27 15:56:04 myIerator::current Line :25
2017-11-27 15:56:04 myIerator::key Line :41
2017-11-27 15:56:04 myIerator::next Line :33

2017-11-27 15:56:04 myIerator::valid Line :58

2017-11-27 15:56:04 myIerator::current Line :25
2017-11-27 15:56:04 myIerator::key Line :41
2017-11-27 15:56:04 myIerator::next Line :33

2017-11-27 15:56:04 myIerator::valid Line :58

2017-11-27 15:56:04 myIerator::current Line :25
2017-11-27 15:56:04 myIerator::key Line :41
2017-11-27 15:56:04 myIerator::next Line :33

2017-11-27 15:56:04 myIerator::valid Line :58

//遍历方式二: $arr->rewind(); while ($arr->valid()) {
   $key = $arr->key();    $value = $arr->current();    echo "{
$key} => {
$value} \r\n";    $arr->next(); }
本文转自 hgditren 51CTO博客,原文链接:http://blog.51cto.com/phpme/2044921,如需转载请自行联系原作者
你可能感兴趣的文章
Solr 按照得分score跟指定字段相乘排序
查看>>
MySQL数据库如何去掉数据库中重复记录
查看>>
【原创】如何写一篇“用户友好”的随笔
查看>>
【16】成对使用new和delete时要采取相同形式
查看>>
POJ 2352 Stars
查看>>
SharpRush中的AOP实现
查看>>
[摘自DbC原则与实践]DbC的一些优点和限制
查看>>
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
.net平台下开源(免费)三维 GIS (地形,游戏)平台资料
查看>>
大公司 or 小公司
查看>>
.h和.cpp文件的区别(zt)
查看>>
SQLSERVER中的锁资源类型RID KEY PAG EXT TAB DB FIL
查看>>
将Datagridview中的数据导出至Excel中
查看>>
c++下面的一个单例
查看>>
git常用命令收藏【转】
查看>>
对象池
查看>>
Android开发环境搭建
查看>>
一个Jquery特效(转)
查看>>
使用log4j的时候如何输出printStackTrace()的堆栈信息
查看>>
C#引用Interop.SQLDMO.dll后的注意事项(转) - coolsundy
查看>>