To see how such side effects work, consider the following snippet:
$a = array(111, 222, 333);
$b = $a;
$b[0] = 999;
var_dump($a, $b);
$dummyReferenceVariable = &$a[0];
$dummyReferenceVariable = 444;
var_dump($a, $b);
$c = $a;
$d = $b;
var_dump($a, $b, $c, $d);
$a[0] = 555;
$b[0] = 666;
$c[0] = 777;
$d[0] = 888;
var_dump($a, $b, $c, $d);
I will illustrates what happens under the hood with the following diagrams (what happens internally when arrays are assigned-by-value is already covered by this post), whose example in its answer starts the same as this one although the question asked is a different one:
NOTE: In the diagrams orange links behave such that when the array the pointing array element belongs to is assigned, the corresponding array element in the array copy will point to the same location with copy-on-write disabled. On the other hand, black links indicate that when an array element is assigned the value will be copied to a new memory location (copy-on-write):



Just to make my point, here is the program's output:
array(3) {
[0]=>
int(111)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
int(999)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
&int(444)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
int(999)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
&int(444)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
int(999)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
&int(444)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
int(999)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
&int(777)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
int(666)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
&int(777)
[1]=>
int(222)
[2]=>
int(333)
}
array(3) {
[0]=>
int(888)
[1]=>
int(222)
[2]=>
int(333)
}
Note. This peculiarity only takes place when assigning references to array elements, as the following straightforward snippet confirms:
// ASSIGNING REFERENCE VALUES TO SCALARS (INSTEAD OF ARRAY ELEMENTS) WORK AS EXPECTED:
$a = 111;
$aRef = &$a;
$a = 222;
var_dump($a, $aRef); // 222, 222
$aRef = 333;
var_dump($a, $aRef); // 333, 333
$c = $a;
$d = $aRef;
$c = 444;
$d = 555;
var_dump($a, $aRef, $c, $d); // 333, 333, 444, 555
which outputs the following as expected:
int(222)
int(222)
int(333)
int(333)
int(333)
int(333)
int(444)
int(555)
Here is what happens under-the-hood in the above scalars case:
