iteratoraggregate를 사용하여 멤버 배열을 반복합니다
문제
수업이 있고 특정 배열 멤버를 반복 할 수 있기를 원합니다. 나는 빠른 검색을하고 발견했다 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()
, 그러나 나는 내부적으로 사용하는 배열의 멤버 이름과 서브 클래스로 덮어 쓰일 수 있는지 여부를 모른다.
문제는 : 이것이 조기 및/또는 불필요한 최적화입니까? 그렇지 않다면, 이것을 달성하는 가장 좋은 방법은 무엇입니까?
해결책
두 번째 코드는 새 루프를 시작하기 전에 새 루프를 시작하는 객체의 여러 고리에서 실패합니다.
실제로 시간을 보내는 가치가있는 최적화처럼 보이지 않았습니다.
다른 팁
그러나 Foreach가 사용될 때마다 새 배열 인스턴스를 생성하지 않습니까?
예, 그리고?
제휴하지 않습니다 StackOverflow