質問
クラスがあり、特定の配列メンバーを反復処理できるようにします。クイック検索を行ったところ、 IteratorAggregate
:
class foo implements IteratorAggregate
{
protected クラスがあり、特定の配列メンバーを反復処理できるようにします。クイック検索を行ったところ、 IteratorAggregate
:
が見つかりました。
protected クラスがあり、特定の配列メンバーを反復処理できるようにします。クイック検索を行ったところ、 IteratorAggregate
:
が見つかりました。
class foo implements IteratorAggregate
{
protected クラスがあり、特定の配列メンバーを反復処理できるようにします。クイック検索を行ったところ、 IteratorAggregate
:
が見つかりました。
<*>
これはうまく機能しますが、 foreach
が使用されるたびに新しい ArrayIterator
インスタンスを作成しませんか?
したがって、イテレータインスタンスをメンバーに保存する必要があると考えました:
<*>
問題は、イテレータが getIterator()
の最初の呼び出し中に $ this-&gt; _array
のコピーを使用するため、メンバーへの変更が行われないことです。後続の foreach
構造に反映されます。
ArrayIterator
をサブクラス化し、 setArray($ array)
メソッドを追加し、 getIterator()
で返す前に呼び出す必要があると考えていました、しかし、内部的に使用する配列のメンバー名と、サブクラスによって上書き可能かどうかはわかりません。
問題は、これは時期尚早な、および/または不必要な最適化ですか?いいえの場合、これを達成する最良の方法は何ですか?
array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
これはうまく機能しますが、 foreach
が使用されるたびに新しい ArrayIterator
インスタンスを作成しませんか?
したがって、イテレータインスタンスをメンバーに保存する必要があると考えました:
<*>
問題は、イテレータが getIterator()
の最初の呼び出し中に $ this-&gt; _array
のコピーを使用するため、メンバーへの変更が行われないことです。後続の foreach
構造に反映されます。
ArrayIterator
をサブクラス化し、 setArray($ array)
メソッドを追加し、 getIterator()
で返す前に呼び出す必要があると考えていました、しかし、内部的に使用する配列のメンバー名と、サブクラスによって上書き可能かどうかはわかりません。
問題は、これは時期尚早な、および/または不必要な最適化ですか?いいえの場合、これを達成する最良の方法は何ですか?
iterator;
public function getIterator()
{
if (!$this->_iterator instanceof ArrayIterator) {
$this->_iterator = new ArrayIterator($this->_array);
}
return $this->_iterator;
}
これはうまく機能しますが、 foreach
が使用されるたびに新しい ArrayIterator
インスタンスを作成しませんか?
したがって、イテレータインスタンスをメンバーに保存する必要があると考えました:
<*>
問題は、イテレータが getIterator()
の最初の呼び出し中に $ this-&gt; _array
のコピーを使用するため、メンバーへの変更が行われないことです。後続の foreach
構造に反映されます。
ArrayIterator
をサブクラス化し、 setArray($ array)
メソッドを追加し、 getIterator()
で返す前に呼び出す必要があると考えていました、しかし、内部的に使用する配列のメンバー名と、サブクラスによって上書き可能かどうかはわかりません。
問題は、これは時期尚早な、および/または不必要な最適化ですか?いいえの場合、これを達成する最良の方法は何ですか?
array = array('foo'=>'bar', 'baz'=>'quux');
public function getIterator()
{
return new ArrayIterator($this->_array);
}
}
これはうまく機能しますが、 foreach
が使用されるたびに新しい ArrayIterator
インスタンスを作成しませんか?
したがって、イテレータインスタンスをメンバーに保存する必要があると考えました:
<*>問題は、イテレータが getIterator()
の最初の呼び出し中に $ this-&gt; _array
のコピーを使用するため、メンバーへの変更が行われないことです。後続の foreach
構造に反映されます。
ArrayIterator
をサブクラス化し、 setArray($ array)
メソッドを追加し、 getIterator()
で返す前に呼び出す必要があると考えていました、しかし、内部的に使用する配列のメンバー名と、サブクラスによって上書き可能かどうかはわかりません。
問題は、これは時期尚早な、および/または不必要な最適化ですか?いいえの場合、これを達成する最良の方法は何ですか?
解決
2番目のコードは、オブジェクトの複数のループで失敗し、別のループが終了する前に新しいループを開始します。
実際には、どちらかに時間をかけるだけの価値がある最適化のように見えます。
他のヒント
しかし、foreachが使用されるたびに新しいArrayIteratorインスタンスを作成しませんか?
はい、そして?