echo "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> "; class Test implements Iterator{ private $list; private $i=0; private $valid=false; public function __construct($array=array()){ $this->list=$array; } /** * 将索引指定到首个元素 * {@inheritDoc} * @see Iterator::rewind() */ function rewind(){ echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>'; $this->valid=(false !==reset($this->list)); } /** * 返回当前元素 * {@inheritDoc} * @see Iterator::current() */ function current(){ echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>'; return current($this->list); } /** * 索引指向下一个元素 * {@inheritDoc} * @see Iterator::next() */ function next(){ echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>'; $this->valid=(false !== next($this->list)); } /** * 返回当前元素键值 * {@inheritDoc} * @see Iterator::key() */ function key(){ echo '第'.++$this->i.'步:执行 '.__METHOD__.'<br>'; return key($this->list); } /** * 判断下个是否有下个元素 * {@inheritDoc} * @see Iterator::valid() */ function valid(){ echo '第'.++$this->_step.'步:执行 '.__METHOD__.'<br>'; return $this->valid; } } $list=array(1,2,3); $test=new Test($list); //foreach循环方式 foreach ($test as $key=>$val){ echo '输出索引为'.$key.'的元素值为:'.$val.'<br/><br/>'; } echo '----------------结束分隔线-----------------------<br/>'; $second=new Test($list); //while循环方式 $second->rewind(); while($second->valid()){ echo '输出索引为'.$second->key().'的元素值为:'.$second->current().'<br/><br/>'; $second->next(); } echo '--------------------结束分隔线----------------------<br/>';
输出格式:
第1步:执行 Test::rewind
第1步:执行 Test::valid
第2步:执行 Test::current
第3步:执行 Test::key
输出索引为0的元素值为:1
第4步:执行 Test::next
第2步:执行 Test::valid
第5步:执行 Test::current
第6步:执行 Test::key
输出索引为1的元素值为:2
第7步:执行 Test::next
第3步:执行 Test::valid
第8步:执行 Test::current
第9步:执行 Test::key
输出索引为2的元素值为:3
第10步:执行 Test::next
第4步:执行 Test::valid
----------------结束分隔线-----------------------
第1步:执行 Test::rewind
第1步:执行 Test::valid
第2步:执行 Test::key
第3步:执行 Test::current
输出索引为0的元素值为:1
第4步:执行 Test::next
第2步:执行 Test::valid
第5步:执行 Test::key
第6步:执行 Test::current
输出索引为1的元素值为:2
第7步:执行 Test::next
第3步:执行 Test::valid
第8步:执行 Test::key
第9步:执行 Test::current
输出索引为2的元素值为:3
第10步:执行 Test::next
第4步:执行 Test::valid
--------------------结束分隔线----------------------
执行到valid返回false时,则循环结束