|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2011-09-19 02:46 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Nov 08 07:00:02 2025 UTC |
see blow: <?php $Item = array ('foo' => 'bar'); $Array = array (&$Item); $rItem = & $Array[0]; $rItem['foo'] = 'foobar'; echo $Item['foo'];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.<?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.