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