日曜プログラミング

PHP好き集まれ〜!!

Iteratorインターフェイスで実験

ここらへんの記事
vol.12 ‐ PHP『Standard PHP Library(SPL) Iteratorインターフェイス編』 | 特集・コラム特集・コラム
vol.13 ‐ PHP『Standard PHP Library(SPL) Iteratorインターフェイス編2』 | 特集・コラム特集・コラム
を参考にそのまま自分で確かめてみました。

やろうとしていることは
foreach文を使った場合と同じ結果になるその他の処理、
例えばwhile文、Iteratorとforeach文、Iteratorとwhile文。
foreach文を含めて、合計4つの処理を書きました。

<?php
/* 配列宣言 */
$arr = ["one","two", 0, "3rd" => "three"];

echo "-------------foreach()------------------", PHP_EOL;

foreach($arr as $key=>$value){
	echo "Key:$key; Value:$value", PHP_EOL;
}

echo "-------------while()--------------------", PHP_EOL;

reset($arr); //配列のポインタ初期化
while(false !== ($value = current($arr))){
	$key = key($arr);
	echo "Key:$key; Value:$value", PHP_EOL;
	next($arr);
}

echo "--------------Iterator-foreach()-------------",PHP_EOL;
/*
interface 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); //現在の位置が有効かどうか判定
}
*/
/* current,key,nextのabstractメソッドはwhile文の関数と同じ意味になる。
   またrewindはreset,validもwhile()の条件式と同じです */

class ArrIterator implements Iterator {
	
	protected $attributes = [];
	public function __construct(array $arr){$this->attributes = $arr;}
	
	public function rewind(){reset($this->attributes);}
	public function current(){return current($this->attributes);}
	public function key(){return key($this->attributes);}
	public function next(){return next($this->attributes);}
	public function valid(){return false !== current($this->attributes);}
}

foreach($obj as $key => $value){
	echo "Key:$key; Value:$value", PHP_EOL;
}

echo "--------------Iterator-while()-------------", PHP_EOL;
$obj = new ArrIterator($arr);
$obj->rewind();
while($obj->valid()){
	$key = $obj->key();
	$value = $obj->current();
	echo "Key:$key; Value:$value", PHP_EOL;
	$obj->next();
}


/* 出力結果 */
-------------foreach()------------------
Key:0; Value:one
Key:1; Value:two
Key:2; Value:0
Key:3rd; Value:three
-------------while()--------------------
Key:0; Value:one
Key:1; Value:two
Key:2; Value:0
Key:3rd; Value:three
--------------Iterator-foreach()-------------
Key:0; Value:one
Key:1; Value:two
Key:2; Value:0
Key:3rd; Value:three
--------------Iterator-while()-------------
Key:0; Value:one
Key:1; Value:two
Key:2; Value:0
Key:3rd; Value:three

すべて同じ出力結果になることが確認できました。