Перебор массива элементов с помощью IteratorAggregate

StackOverflow https://stackoverflow.com/questions/331376

  •  11-07-2019
  •  | 
  •  

Вопрос

У меня есть класс, и я хочу иметь возможность перебирать определенный элемент массива.Я сделал быстрый поиск и нашел IteratorAggregate:

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

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

который отлично работает, но разве это не создает новый ArrayIterator экземпляр каждый раз foreach используется на нем?

Поэтому я подумал, что мне следует сохранить экземпляр итератора в члене:

    protected $_iterator;

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

Проблема в том, что итератор использует копию $this->_array во время первого звонка getIterator(), поэтому изменения члена не отражаются на последующих foreach конструкции.

Я думал, мне следует создать подкласс ArrayIterator, добавить setArray($array) метод и вызовите его, прежде чем вернуть его в getIterator(), но я не знаю имя члена массива, который он использует внутри, и можно ли его перезаписать подклассом.

Вопрос в том:это преждевременная и/или ненужная оптимизация?Если нет, то как лучше всего этого добиться?

Это было полезно?

Решение

Второй код потерпит неудачу в нескольких циклах объекта, где вы начнете новый цикл до завершения другого.

Это тоже не выглядело как оптимизация, на которую стоит тратить время.

Другие советы

  

но разве это не создает новый экземпляр ArrayIterator каждый раз, когда на нем используется foreach?

да и?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top