明示的にそう言っているドキュメントを見つけるのに苦労していますが、配列が保持されている内部ArrayIterator
のプライベート$storage
プロパティは、オブジェクト内に直接格納されている配列自体ではなく、配列への参照である必要があります。
のドキュメントにclone
は、
PHP 5 は、オブジェクトのすべてのプロパティの浅いコピーを実行します。他の変数への参照であるプロパティは、参照のままです。
したがってclone
、ArrayIterator
オブジェクトを取得すると、新しく複製されたオブジェクトには、元の配列と同じ配列への参照が含まれます。 これは、この動作が予期された動作であると言われている古いバグ レポートです。
の現在の状態をコピーしたい場合は、代わりに、によって返されるArrayIterator
配列を使用して新しい状態をインスタンス化することを検討してください。getArrayCopy()
$iter = new \ArrayIterator([1,2,3,4,5]);
// Copy out the array to instantiate a new one
$copy = new \ArrayIterator($iter->getArrayCopy());
// Modify it
$copy->append(6);
var_dump($iter); // unmodified
php > var_dump($iter);
class ArrayIterator#1 (1) {
private $storage =>
array(5) {
[0] =>
int(1)
[1] =>
int(2)
[2] =>
int(3)
[3] =>
int(4)
[4] =>
int(5)
}
}
var_dump($copy); // modified
class ArrayIterator#2 (1) {
private $storage =>
array(6) {
[0] =>
int(1)
[1] =>
int(2)
[2] =>
int(3)
[3] =>
int(4)
[4] =>
int(5)
[5] =>
int(6)
}
}
ただし、上記は単純な操作であり、ArrayIterator
現在格納されている配列を元として新しいものを作成するだけです。現在の反復状態は維持されません。seek()
これを行うには、ポインターを目的の位置に進めるためにも呼び出す必要があります。これは、それがどのように行われるかを説明する完全な回答です。