akkun_choi pedia
mindiaakkun_choi pedia見出し語

PHPのIterator

akkun_choi · 2009-12-24 更新 · 1 ポイント

Zend FrameworkSPLIterator使ってるのが多い。

インタフェース

Iterator

実装すればforeachで回すことができる

http://jp2.php.net/manual/ja/class.iterator.php
>|php|
<?php
class myIterator implements Iterator {
private $position = 0;
private $array = array(
"firstelement",
"secondelement",
"lastelement",
);

public function __construct() {
$this->position = 0;
}

function rewind() {
var_dump(__METHOD__);
$this->position = 0;
}

function current() {
var_dump(__METHOD__);
return $this->array[$this->position];
}

function key() {
var_dump(__METHOD__);
return $this->position;
}

function next() {
var_dump(__METHOD__);
++$this->position;
}

function valid() {
var_dump(__METHOD__);
return isset($this->array[$this->position]);
}
}

$it = new myIterator;

foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}
?>
||<

IteratorAggregate

getIterator()を持つ。他のiteratorを持っていて、それを使いたい場合にproxy的に使う。

RecursiveIterator

ツリー構造をトラバースする時に使えそうだけど、まだ使う機会がない

SeekableIterator

インデックス指定ができる。例えばZend_Service_Amazon_ResultSetが実装している。

OuterIterator

Iteratorをラップする。getInnerIteratorを持つ。

クラス

ArrayIterator

arrayをIteratorにしたいときに

DirectoryIterator

FilterIterator

OuterIteratorを実装。抽象クラス。accept()でフィルタリングできる。callbackで指定できればわざわざクラス作らなくてもいいのになぁ。

LimitIterator

指定位置から返したり、指定数を返したりできる。

例えばこんな感じで配列から指定条件を指定数取得できるんじゃね。
>|php|
$it = new LimitIterator(new MyFilterIterator(new ArrayIterator($array)), 0, 10);
class MyFilterIterator extends FilterIterator{
function accept(){
// return boolean
}
}
||<

参考

http://php.net/manual/ja/language.oop5.iterations.php
http://www.php.net/manual/ja/spl.iterators.php
http://devzone.zend.com/article/2565

関連する見出し語