Ich lese momentan "professionelle-softwareentwicklung-mit-php5".
Dort steht:
	
		
Habe ich AFAIK erledigt, doch wie bringe ich den LimitIterator nun dazu, die seek() und nicht die next() Funktion zu nutzen?
korrigierte Version:
	
Ausgabe
	
							
						
					Dort steht:
			
			
				        Für Mengen, bei denen die Position auf ein bestimmtes Element direkt       gesetzt werden kann, bietet sich die Erweiterung der Klasse       LimitIterator durch eine Kindklasse an, die zusätzlich die       Schnittstelle SeekableIterator implementiert. Als einzige       Methode dieser Schnittstelle ist seek($position) zu       implementieren. Ein Objekt einer solchen Klasse kann nun effizient       an die gewünschte Position springen.     
Quelle: Die Standard PHP Library (SPL)
	Quelle: Die Standard PHP Library (SPL)
korrigierte Version:
PHP-Code:
	
	
class Number implements IteratorAggregate
{
    public $number;
    public function __construct( $number )
    {
        $this->number = preg_replace( "#[^0-9]#", "", $number );
    }
    public function getIterator()
    {
        return new NumberIterator( $this->number );
    }
}
class NumberIterator implements Iterator, SeekableIterator
{
    public $number;
    public $i;
    
    public function __construct( $number )
    {
        $this->number = $number;
    }    
    public function rewind()
    {
        $i = 0;
    }
    public function valid()
    {
        return $this->i < strlen( $this->number );
    }
    public function current()
    {
        return substr( $this->number, $this->i, 1 );
    }
    public function key()
    {
        return $this->i;
    }
    public function next()
    {
        $this->i++;
        echo 'Iterator::next';
    }
    public function seek( $position )
    {
        echo 'NumberIterator::seek';
        $this->i = $position;
    }
}
$number = new Number( "341913412" );
$numberiterator = $number->getIterator();
$limititerator = new LimitIterator( $numberiterator, 3, 2 );
foreach ($limititerator as $key => $value) {
    print " $value\n";
} 
Code:
	
	NumberIterator::seek 9 Iterator::next 1 Iterator::next
 
          
Kommentar