Edit report at https://bugs.php.net/bug.php?id=55723&edit=1
ID: 55723 User updated by: exsystemchina at gmail dot com Reported by: exsystemchina at gmail dot com Summary: Array of references return copies of elements instead of references Status: Bogus Type: Bug Package: Arrays related Operating System: Windows XP Pro SP 3 PHP Version: 5.3.8 Block user comment: N Private report: N New Comment: <?php $ArrayMeta = array('a'=>1, 'b'=>array ('bb' => 2)); var_dump($ArrayMeta); $mPendingStack = array (&$ArrayMeta); $mCurrArray = null; //Reference to current array. while (count($mPendingStack) != 0) { $mCurrArray = &$mPendingStack[count($mPendingStack)-1]; unset($mPendingStack[count($mPendingStack)-1]); foreach ($mCurrArray as &$mValue) { if (is_array($mValue)) { $mPendingStack[count($mPendingStack)] = $mValue; //If I removed & before $mValue... } else { $mValue = null; } } } var_dump($ArrayMeta); And still, PHP Manual shows me that the & symbol in foreach clause will produce reference. But this is also problemetic in this script. Only $ArrayMeta['a'] turned to null. Previous Comments: ------------------------------------------------------------------------ [2011-09-19 09:41:17] exsystemchina at gmail dot com Wired, still problemetic. Compare with those two scripts: <?php $ArrayMeta = array('a'=>1, 'b'=>array ('bb' => 2)); $mPendingStack = array (&$ArrayMeta); $mCurrArray = null; //Reference to current array. while (count($mPendingStack) != 0) { $mCurrArray = &$mPendingStack[count($mPendingStack)-1]; unset($mPendingStack[count($mPendingStack)-1]); reset($mCurrArray); for ($i = 0; $i < count($mCurrArray); ++$i) { if (is_array($mCurrArray[key($mCurrArray)])) { $mPendingStack[count($mPendingStack)] = &$mCurrArray[key($mCurrArray)]; } else { $mCurrArray[key($mCurrArray)] = null; } next($mCurrArray); } } var_dump($ArrayMeta); ?> and <?php $ArrayMeta = array('a'=>1, 'b'=>array ('bb' => 2)); $mPendingStack = array (&$ArrayMeta); $mCurrArray = null; //Reference to current array. while (count($mPendingStack) != 0) { $mCurrArray = &$mPendingStack[count($mPendingStack)-1]; unset($mPendingStack[count($mPendingStack)-1]); foreach ($mCurrArray as &$mValue) { if (is_array($mValue)) { $mPendingStack[count($mPendingStack)] = &$mValue; } else { $mValue = null; } } } var_dump($ArrayMeta); ?> Array elements of references can be found via both two ouputs, though those outputs were different. But the expected result should contains no reference, since I var_dump- ed $ArrayMeta, which should be no reference inside it. I think it is little bit buggy. Those are tested under PHP 5.3.8 and PHP 5.3.5. ------------------------------------------------------------------------ [2011-09-19 07:09:19] exsystemchina at gmail dot com OK. it's wired though. ------------------------------------------------------------------------ [2011-09-19 04:58:31] larue...@php.net see blow: <?php $Item = array ('foo' => 'bar'); $Array = array (&$Item); $rItem = & $Array[0]; $rItem['foo'] = 'foobar'; echo $Item['foo']; ------------------------------------------------------------------------ [2011-09-19 02:50:37] exsystemchina at gmail dot com [Sorry, Grammar Error.]When trying to get [an] element of reference inside an array, php always returns a copy of that variable being referred. See the comment of Test Script. ------------------------------------------------------------------------ [2011-09-19 02:46:35] exsystemchina at gmail dot com Description: ------------ When trying to get a element of reference inside an array, php always returns a copy of that variable being referred. See the comment of Test Script. Test script: --------------- <?php $Item = array ('foo' => 'bar'); $Array = array (&$Item); $rItem = $Array[0]; //$rItem is expected to be a reference, but it doesn't. $rItem['foo'] = 'foobar'; echo $Item['foo']; Expected result: ---------------- foobar Actual result: -------------- bar ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=55723&edit=1