Frage

Ich habe eine Klasse, und ich möchte in der Lage sein ein bestimmtes Arraymitglied iterieren. Ich habe eine schnelle Suche und fand IteratorAggregate:

class foo implements IteratorAggregate
{
    protected $_array = array('foo'=>'bar', 'baz'=>'quux');

    public function getIterator()
    {
        return new ArrayIterator($this->_array);
    }
}

die großen Werke, aber nicht, dass keine neue ArrayIterator Instanz jedes Mal foreach wird darauf verwendet, erstellen?

Also dachte ich, ich den Iterator-Instanz in einem Element gespeichert werden sollte:

    protected $_iterator;

    public function getIterator()
    {
        if (!$this->_iterator instanceof ArrayIterator) {
            $this->_iterator = new ArrayIterator($this->_array);
        }
        return $this->_iterator;
    }

Das Problem ist, dass der Iterator eine Kopie $this->_array beim ersten Aufruf von getIterator() verwendet, so dass Änderungen an dem Element nicht auf nachfolgenden foreach Konstrukte reflektiert werden.

Ich dachte, ich ArrayIterator Unterklasse sollte, fügen Sie eine setArray($array) Methode und nennen Sie es, bevor es in getIterator() zurückkehren, aber ich weiß nicht, den Namen des Mitglieds des Arrays intern verwendet es und ob es von einer Unterklasse überschreibbar ist.

Die Frage ist: ist dies eine vorzeitige und / oder unnötige Optimierung? Wenn nein, was ist der beste Weg, um dies zu erreichen?

War es hilfreich?

Lösung

Sie zweiter Code auf mehreren Schleifen des Objekts fehlschlagen werden, wo Sie eine neue Schleife starten, bevor ein anderes beendet ist.

sehe nicht wirklich wie eine Optimierung wert Zeit entweder zu verbringen.

Andere Tipps

  

aber nicht, dass keine neue ArrayIterator Instanz erstellen jedes Mal foreach auf sie verwendet wird?

Ja, und?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top