मुझे लगता है मैं यहाँ कुछ बेवकूफ कर रहा हूँ, लेकिन मैं क्या एसपीएल के साथ एक सरल समस्या की तरह लगता है द्वारा उलझन में हूँ:रिकर्सिवएरे इटरेटर का उपयोग करते समय मैं सरणी कुंजियों और मानों को कैसे बदलूं?
मैं कैसे एक सरणी की सामग्री (इस उदाहरण में मान) संशोधित, एक का उपयोग कर RecursiveArrayIterator/RecursiveIteratorIterator?
अनुवर्ती परीक्षण कोड का उपयोग करके, मैं getInnerIterator() और offsetSet() का उपयोग करके लूप के भीतर मान को बदल सकता हूं, और जब मैं लूप के अंदर संशोधित सरणी को डंप कर सकता हूं।
लेकिन जब मैं लूप छोड़ देता हूं और सरणी को सरणी से डंप करता हूं, तो यह मूल मानों पर वापस आ जाता है। क्या हो रहा है? getInnerIterator एक कॉपी उप इटरेटर की बनाता है की तरह
$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);
ऐसा लगता है कि यह एक बग आप http://bugs.php.net/ – null