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
すべて同じ出力結果になることが確認できました。