Tôi nghi ngờ tôi đang làm điều ngu ngốc ở đây, nhưng tôi bị nhầm lẫn bởi những gì có vẻ như một vấn đề đơn giản với SPL:Làm cách nào để thay đổi các giá trị và khóa mảng trong khi sử dụng RecursiveArrayIterator?
Làm cách nào để sửa đổi nội dung của một mảng (giá trị trong ví dụ này), bằng cách sử dụng RecursiveArrayIterator/RecursiveIteratorIterator?
Sử dụng mã kiểm tra tiếp theo, tôi có thể thay đổi giá trị trong vòng lặp bằng cách sử dụng getInnerIterator() và offsetSet() và kết xuất mảng đã sửa đổi trong khi tôi đang trong vòng lặp.
Nhưng khi tôi rời khỏi vòng lặp và kết xuất mảng từ trình lặp, nó trở về giá trị ban đầu. Chuyện gì vậy?
$aNestedArray = array();
$aNestedArray[101] = range(100, 1000, 100);
$aNestedArray[201] = range(300, 25, -25);
$aNestedArray[301] = range(500, 0, -50);
$cArray = new ArrayObject($aNestedArray);
$cRecursiveIter = new RecursiveIteratorIterator(new RecursiveArrayIterator($cArray), RecursiveIteratorIterator::LEAVES_ONLY);
// Zero any array elements under 200
while ($cRecursiveIter->valid())
{
if ($cRecursiveIter->current() < 200)
{
$cInnerIter = $cRecursiveIter->getInnerIterator();
// $cInnerIter is a RecursiveArrayIterator
$cInnerIter->offsetSet($cInnerIter->key(), 0);
}
// This returns the modified array as expected, with elements progressively being zeroed
print_r($cRecursiveIter->getArrayCopy());
$cRecursiveIter->next();
}
$aNestedArray = $cRecursiveIter->getArrayCopy();
// But this returns the original array. Eh??
print_r($aNestedArray);
Hình như đây là lỗi bạn nên nộp vào http://bugs.php.net/ – null