PHP ref operator

assignment is deep copyOnWrite

a original.. [0-x, 1-ya, 2-x, [3.0-x, 3.1-ya, 3.2-x], [[4.0.0-x, 4.0.1-ya, 4.0.2-x]]]
b copy of a0 [0-x, 1-x, 2-yb, [3.0-x, 3.1-x, 3.2-yb], [[4.0.0-x, 4.0.1-x, 4.0.2-yb]]]

references are NOT pointers, but refer to variables!

0 ini ..... : a=[[a0, b0], [c0, d0], &$v=varV0], q=[a0, b0], r=[c0, d0], v=&$v=varV0
1 $* = *1 . : a=[[a1, b0], [c1, r1], &$v=varV1], q=[a0, q1], r=[c1, r1], v=&$v=varV1
b copy of a0: b=[[a0, b0], [c1, r1], &$v=varV1, bCopiedFromA0]
2 fa($*, *2): a=[[a2, b0], [c1, r1], &$v=varV1], q=[a0, q1], r=[c1, r1]
3 fr($*, *2): a=[[a3, b0], [c3, r3], &$v=varV1], q=[a0, q3], r=[c3, r3]
*** however, references to array indexes, belong to array, not variable
4 a1=>str: a=[[a3, b0], a1-string4, [var, V4]], q=[a0, q3], r=a1-string4
5 s=>new arr a=[[a3, b0], [sa5, sb5, sc5], [var, V4]], q=[a0, q3], r=[sa5, sb5, sc5]
5 new $a: a=[[n5, o5], p5], q=[a0, q3], r=[sa5, sb5, sc5]
*** confusing use of reference
w[0] ref ov v v=&$v7, w=[&$v7]
added new v v=[...v8, 8], w=[[...v8, 8], [...v8, 8]]

foreach reference

  1. foreach and references [[0, zero], [1, eins], [2, zwei]]
  2. after foreach $k => $v [[0, zero], [1, eins], [2, zwei]]
  3. after foreach $k => $v [[0, zero+r0], [1, eins+r1], [2, zwei+r2]] h=012
  4. backward value v= [[0, zero+r0], [1, eins+r1], [2, zwei+r2]] h=210
  5. backward ref v=& [[0, zero+r0+c210], [1, eins+r1+c21], [2, zwei+r2+c2]] h=210

End e12ref.php

args

e12ref.php

/home/ch45859/web/wlkl.ch/public_html/inf/php/e12ref.php

*** code does not have a span berfore first <br>***
<?php
require_once('env.php');
outBegin('PHP ref operator');
outH('assignment is deep copyOnWrite');
$a = ['0-x', '1-x', '2-x', ['3.0-x', '3.1-x', '3.2-x'], [['4.0.0-x', '4.0.1-x', '4.0.2-x']]];
$b = $a; 
$a[1] = '1-ya';
$a[3][1] = '3.1-ya';
$a[4][0][1] = '4.0.1-ya';
$b[2] = '2-yb';
$b[3][2] = '3.2-yb';
$b[4][0][2] = '4.0.2-yb';
out('a original..', $a);
out('b copy of a0', $b);

outH('references are NOT pointers, but refer to variables!');
$v = '&$v=varV0';
$a = [['a0', 'b0'], ['c0' , 'd0'], &$v];
$q = $a[0];
$r = &$a[1];
$s = &$a[1];
$b = $a;
$b[] = 'bCopiedFromA0';
outEC('0 ini ..... : a', $a, 'q', $q, 'r', $r, 'v', $v);
$a[0][0] = 'a1';
$a[1][0] = 'c1';
$q[1] = 'q1';
$r[1] = 'r1';
$v = '&$v=varV1';
outEC('1 $* = *1 . : a', $a, 'q', $q, 'r', $r, 'v', $v);
outEC('b copy of a0: b', $b);

$a[0][0] = 'a2';
fa($a[1][0], 'c2');
fa1($q, 'q2');
fa1($r, 'r2');
outEC('2 fa($*, *2): a', $a, 'q', $q, 'r', $r);

$a[0][0] = 'a3';
fr($a[1][0], 'c3');
fr1($q, 'q3');
fr1($r, 'r3');
outEC('3 fr($*, *2): a', $a, 'q', $q, 'r', $r);

out('*** however, references to array indexes, belong to array, not variable');
$a[1] = 'a1-string4';
$v = ['var', 'V4'];
outEC('4 a1=>str:    a', $a, 'q', $q, 'r', $r);
$s = ['sa5', 'sb5', 'sc5'];
outEC('5 s=>new arr  a', $a, 'q', $q, 'r', $r);
$a = [['n5', 'o5'], 'p5'];
outEC('5 new $a:     a', $a, 'q', $q, 'r', $r);
out('*** confusing use of reference');
$v='&$v7';
$w=[&$v];
outEC('w[0] ref ov v  v', $v, 'w', $w);
$v = ['...v8', 8];
$w[] = &$v;
outEC('added new v    v', $v, 'w', $w);
outH("foreach reference");

unset($a, $v);
$a = [[0, 'zero'], [1, 'eins'], [2, 'zwei']];
outOL("foreach and references", $a);
foreach($a as $k => $v)
    $v[1] .= "+v$k";
outLi('after foreach $k => $v', $a);
$h='';
foreach($a as $k => &$v) {
    $v[1] .= "+r$k";
    $h .= $k;
}
outLi('after foreach $k => $v', $a, "h=$h");
unset($v); # this is crucial, otherwise references will be redirected!!!!!!!!!!!!!
$h='';
for ($v=end($a); $v !== false; $v=prev($a)) {
    $k= key($a);
    #$v[1] .= "+b$k";
    $h .= $k;
}
outLi('backward value v=', $a, "h=$h");
$h='';
for ($v=end($a); $v !== false; $v=prev($a)) {
    $k= key($a);
    $v = &$a[$k]; # no otherway to get reference!
    $h .= $k;
    $v[1] .= "+c$h";
    unset($v); # this is crucial, otherwise references will be redirected!!!!!!!!!!!!!
}
outLi('backward ref v=&', $a, "h=$h");

outOLEnd();

outEnd(__file__);
function fa($a, $v) {
    $a = $v;
}
function fa1($a, $v) {
    $a [1] = $v;
}

function fr(&$a, $v) {
    $a = $v;
}

function fr1(&$a, $v) {
    $a [1] = $v;
}

?>