©
本文档使用 PHP中文网手册 发布
(No version information available, might only be in Git)
创建外部迭代器的接口。
Example #1 基本用法
<?php
class myData implements IteratorAggregate {
public $property1 = "Public property one" ;
public $property2 = "Public property two" ;
public $property3 = "Public property three" ;
public function __construct () {
$this -> property4 = "last property" ;
}
public function getIterator () {
return new ArrayIterator ( $this );
}
}
$obj = new myData ;
foreach( $obj as $key => $value ) {
var_dump ( $key , $value );
echo "\n" ;
}
?>
以上例程的输出类似于:
string(9) "property1" string(19) "Public property one"string(9) "property2" string(19) "Public property two"string(9) "property3" string(21) "Public property three"string(9) "property4" string(13) "last property"
[#1] ribeirocfb at gmail dot com [2015-08-24 23:21:57]
Example of the Iterator Pattern
<?php
namespace DesignPaterns;
class BookCollection implements \IteratorAggregate
{
private $a_titles = array();
public function getIterator()
{
return new BookIterator($this);
}
public function addTitle($string)
{
$this->a_titles[] = $string;
}
public function getTitle($key)
{
if (isset($this->a_titles[$key])){
return $this->a_titles[$key];
}
return null;
}
public function is_empty()
{
return empty($a_titles);
}
}
<?php
namespace DesignPaterns;
class BookIterator implements \Iterator
{
private $i_position = 0;
private $booksCollection;
public function __construct(BookCollection $booksCollection)
{
$this->booksCollection = $booksCollection;
}
public function current()
{
return $this->booksCollection->getTitle($this->i_position);
}
public function key()
{
return $this->i_position;
}
public function next()
{
$this->i_position++;
}
public function rewind()
{
$this->i_position = 0;
}
public function valid()
{
return !is_null($this->booksCollection->getTitle($this->i_position));
}
}
<?php require 'vendor/autoload.php';
use DesignPaterns\BookCollection;
$booksCollection = new BookCollection();
$booksCollection->addTitle('Design Patterns');
$booksCollection->addTitle('PHP7 is the best');
$booksCollection->addTitle('Laravel Rules');
$booksCollection->addTitle('DHH Rules');
foreach($booksCollection as $book){
var_dump($book);
}
[#2] Lubaev.K [2013-06-16 11:49:00]
<?php
// IteratorAggregate
// Create indexed and associative arrays.
class myData implements IteratorAggregate {
private $array = [];
const TYPE_INDEXED = 1;
const TYPE_ASSOCIATIVE = 2;
public function __construct( array $data, $type = self::TYPE_INDEXED ) {
reset($data);
while( list($k, $v) = each($data) ) {
$type == self::TYPE_INDEXED ?
$this->array[] = $v :
$this->array[$k] = $v;
}
}
public function getIterator() {
return new ArrayIterator($this->array);
}
}
$obj = new myData(['one'=>'php','javascript','three'=>'c#','java',], );
foreach($obj as $key => $value) {
var_dump($key, $value);
echo PHP_EOL;
}
// if TYPE == 1
#int(0)
#string(3) "php"
#int(1)
#string(10) "javascript"
#int(2)
#string(2) "c#"
#int(3)
#string(4) "java"
// if TYPE == 2
#string(3) "one"
#string(3) "php"
#int(0)
#string(10) "javascript"
#string(5) "three"
#string(2) "c#"
#int(1)
#string(4) "java"
?>
Good luck!
[#3] Tab Atkins [2012-04-29 02:11:27]
Note that, at least as of 5.3, you still aren't allowed to return a normal Array from getIterator().
In some places, the docs wrap the array into an ArrayObject and return that. DON'T DO IT. ArrayObject drops any empty-string keys on the floor when you iterate over it (again, at least as of 5.3).
Use ArrayIterator instead. I wouldn't be surprised if it didn't have its own set of wonderful bugs, but at the very least it works correctly when you use it with this method.