Re: Assign by reference...
| From: | Rasmus Lerdorf | Date: | Tue, 13 Jun 2000 02:40:33 +0000 |
| Subject: | Re: Assign by reference... | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-1681@lists.php.net to get a copy of this message | ||
On Mon, 12 Jun 2000, Benjamin Berman wrote:
> I'm having a problem with the new assign by reference feature in PHP4.
> Consider the following code; it's an artificial example that takes an
> array of numbers, for instance (1,2,3) and transforms it into an array
> of arrays, where each array contains multiples of the original number,
> for instance ((1,10,100), (2,20,200), (3, 30, 300)). Here is the code:
>
>
> 1 $num_arr = array(1, 2, 3);
> 2 $multiples_arr = array();
> 3 while (list($key, $val) = each($num_arr))
> 4 {
> 5 $mult_arr = array($val, $val*10, $val*100);
> 6 $multiples_arr[] = &$mult_arr;
> 7 }
> 8
> 9 while (list($key, $mult_arr) = each($multiples_arr))
> 10 {
> 11 print join(",",$mult_arr)."<BR>\n";
> 12 }
>
>
> I would expect to get the output:
>
> 1,10,100
> 2,20,200
> 3,30,300
>
> But instead, I get the following:
>
> 3,30,300
> 3,30,300
> 3,30,300
>
>
> This is counter-intuitive with respect to other programming languages
> I've used. I can guess what's happening underneath to make PHP display
> this behavior, but it still seems to contradict my notion of what
> "assignment by reference" means. Is there any way to get PHP to do what
> I want it to do here?
I don't understand why you think this is counter-intuitive. To simplify
it way down, you are basically doing:
$a=1;
$b[]=&$a;
$a=2;
$b[]=&$a;
and you expect the $b array to contain 1,2
But since all you are doing is putting a pointer to $a into the $b array
twice, then you cannot possibly have different values in each slot. That
is the whole point of references. There is only 1 copy of $a here.
-Rasmus