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] [email protected]
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