The code is as follows:
$a = [1, 2, 3];foreach($a as $key => &$value) { $value = 5;}var_dump($a);
The final output results are as follows:
array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5) }
Question: Why do I get an address character before the last key value?
Reply content:
The code is as follows:
$a = [1, 2, 3];foreach($a as $key => &$value) { $value = 5;}var_dump($a);
The final output results are as follows:
array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5) }
Question: Why do I get an address character before the last key value?
The & represented in this var_dump you can change its value with a different variable.
Like you do.
$b = &$a[0];var_dump($a);
When printed here, the & symbol appears in the first key value, indicating that you can change its value with other variables ($b).
Let &
's take a look at the basic usage.
$b = $c = 1;$a = &$b;$a = 2;echo "b=$b,c=$c\n";$a = &$c;$a = 100;$a = 200;echo "b=$b,c=$c\n";unset($a);$a = 500;echo "b=$b,c=$c\n";
After a $ A has been specified as a reference to $b, changing $ A will change the value of the corresponding $b unless it is specified again as another reference, or unset ($a).
For you this foreach, is the same truth, you take the loop apart, this is the way:
$value = &$a[0];$value = 5;$value = &$a[1];$value = 5;$value = &$a[2];$value = 5;
The loop runs to the last time, $value is a reference to $a[2], so it is equivalent to this form:
$a[0] = 5;$a[1] = 5;$value = &$a[2];$a[2] = 5;var_dump($a);
It is not difficult to understand why Var_dump will print a & symbol on the last key-value pair.
In general, this will not cause any major problems, but because of the scope of the foreach problem, will cause the loop exit after the $value can still be used, so there will be some strange bugs.
Like this.
$a = [1, 2, 3];foreach($a as $key => &$value) { $value = $value+5;}var_dump($a); // [6,7,8]foreach($a as $value){}var_dump($a); // [6,7,7]
After adding an empty foreach, it turns out that $ A is unreasonable, and the bug is not surprising, because the $value in the empty foreach is the reference to the top &a[2].
The empty foreach is equivalent to this:
$value = &$a[2];$value = $a[0];$value = $a[1];$value = $a[2];
Notice that because $value is a reference to $a[2], the above rewrite is this:
$a[2] = $a[0];$a[2] = $a[1];$a[2] = $a[2];
The empty foreach is constantly changing $a[2], and since $a[2] has become the value of $a[1], $a[2] = $a [2]; no effect, value or $a[1];
This strange bug is due to the scope of the variable $value, so either change the name, or first give the $value to unset off.
$a = [1, 2, 3];foreach($a as $key => &$value) { $value = $value+5;}var_dump($a);// 要么unsetunset($value);// 要么foreach里不要用上面同名的$value,改为$value2222foreach($a as $value2222){}var_dump($a);
First of all, I would like to say that this is a very, very good question. I believe that the main problem is not the separation of reference and non-reference.
I did a little bit of two Tests first:
$a = [1, 2, 3];foreach($a as $key => &$value) { $value = 5;}foreach($a as $key => $value) { $value = 6;}var_dump($a);
What do you guess the output is?
array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(6)}
Another test is:
$a = [1, 2, 3];foreach($a as $key => &$value) { $value = 5;}foreach($a as $key => $value2) { $value2 = 6;}var_dump($a);
This time the output looks a lot more normal:
array(3) { [0]=> int(5) [1]=> int(5) [2]=> &int(5)}
So, the problem should be a hole in the PHP global variable.