介绍
可在内部迭代自己的外部迭代器或类的接口。
|
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();
}