Learn And Life.

迭代器一二

php当中有许多迭代器,但是日常的编程当中可能会很少使用,一方面是因为迭代的功能有限,只能在有限的对象集中使用,另一方面还是面向对象的思想的匮乏,下面看看php当中的一些迭代器

迭代器接口

1
2
3
4
5
6
7
interface Iterator {
function rewind();
function current();
function key();
function next();
function valid();
}

php中的迭代器的应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ArrayIterator implements ArrayAccess , SeekableIterator , Countable , Serializable
AppendIterator extends IteratorIterator implements OuterIterator
CachingIterator extends IteratorIterator implements OuterIterator , ArrayAccess , Countable
CallbackFilterIterator extends FilterIterator implements OuterIterator
DirectoryIterator extends SplFileInfo implements SeekableIterator
EmptyIterator implements Iterator
FilesystemIterator extends DirectoryIterator implements SeekableIterator
abstract FilterIterator extends IteratorIterator implements OuterIterator
GlobIterator extends FilesystemIterator implements SeekableIterator , Countable
InfiniteIterator extends IteratorIterator implements OuterIterator
IteratorIterator implements OuterIterator
LimitIterator extends IteratorIterator implements OuterIterator
MultipleIterator implements Iterator
NoRewindIterator extends IteratorIterator
ParentIterator extends RecursiveFilterIterator implements RecursiveIterator , OuterIterator
RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator
RecursiveCachingIterator extends CachingIterator implements Countable , ArrayAccess , OuterIterator , RecursiveIterator
RecursiveCallbackFilterIterator extends CallbackFilterIterator implements OuterIterator , RecursiveIterator
RecursiveDirectoryIterator extends FilesystemIterator implements SeekableIterator , RecursiveIterator
abstract RecursiveFilterIterator extends FilterIterator implements OuterIterator , RecursiveIterator
RecursiveIteratorIterator implements OuterIterator
RecursiveRegexIterator extends RegexIterator implements RecursiveIterator
RecursiveTreeIterator extends RecursiveIteratorIterator implements OuterIterator
RegexIterator extends FilterIterator

应用举例,遍历目录下面的所有指定后缀的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class RecursiveFileFilterIterator extends FilterIterator{
protected $ext = array('jpg','png','php');
public function __construct($path){
parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
}
public function accept(){
$item = $this->getInnerIterator();
if($item->isFile() && in_array(pathinfo($item->getFilename(),PATHINFO_EXTENSION), $this->ext)){
return true;
}
}
}
foreach(new RecursiveFileFilterIterator('/Users/kivmi/Documents') as $item){
echo $item.PHP_EOL;
}

迭代设计模式

1.创建迭代器

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
namespace platform;
class PlatformIteratorBlock implements \Iterator
{
protected $current = 0;
protected $platformList = null;
public function __construct(PlatformBlocks $platformList)
{
$this->platformList = $platformList;
$this->current = $this->platformList->count() - 1;
}
public function current()
{
return $this->platformList->get($this->current);
}
public function key()
{
return $this->current;
}
public function next()
{
$this->current -- ;
}
public function rewind()
{
$this->current = $this->platformList->count() - 1;
}
public function valid( )
{
return null != $this->platformList->get($this->current);
}
}

2.创建一个篮子

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
namespace platform;
class PlatformBlocks implements \Countable
{
protected $platforms = [];
public function get($n)
{
if(isset($this->platforms[$n]))
{
return $this->platforms[$n];
}
return null;
}
public function add(PlatformBlock $platform)
{
$this->platforms[] = $platform;
}
public function remove(PlatformBlock $platform)
{
foreach ($this->platforms as $k => $block)
{
if($block->getName() == $platform->getName())
{
unset($this->platforms[$k]);
}
}
}
public function count()
{
return count($this->platforms);
}
}

3.从篮子里消费

1
2
3
4
5
6
7
8
9
10
11
12
$platformList = new PlatformListBlock();
$platformList->add(new NewsPlatformBlock());
$iterator = new PlatformIteratorBlock($platformList);
while($iterator->valid())
{
foreach ($iterator->current()->getData() as $params)
{
self::doRequest($iterator->current()->getUrl(), $params);
}
$iterator->next();
}}