数组foreach()遍历中的引用传递
$k = currentKey($arrCopy); //将副本数组本轮次的键的值分配给$k,比如下标0,1,2等;$v = currentVal($arrCopy); //将副本数组本轮次的值分配给$v,比如"aa","bb","cc"等;
next($arrCopy);//移动副本数组的指针
$arr = $arrCopy;//将副本的值回赋给$arr(主要是将指针同步移动)
可以看到,这里的$k 和 $v 一直在遍历过程中用到。
让我们看一看PHP的传递引用在其中如何工作。
示例
<?php$arr = ["aa", "bb", "cc"];
foreach ($arr as $k => $v) {
$v = &$arr[$k];
var_dump($arr);
}
var_dump($arr);
我们逐次来看每一轮遍历,都发生了什么:
1,第一轮遍历:
$k = 0;$v = "aa";
$v = &$arr[$k]; //此时,&$arr[0]引用传递给了$v,$v和$arr[0]共用同一个内存地址,某个发生变化,另一个也发生变化
打印结果
array(3) { [0]=>
&string(2) "aa"
[1]=>
string(2) "bb"
[2]=>
string(2) "cc"
}
2,第二轮遍历
$v = &$arr[0];-----------
$k = 1;
$v = "bb"; //此时,由于上面$v和$arr[0]共用同一个内存地址,$v的值变成了"bb",所以$arr[0]也变成了"bb"
$v = &$arr[1];//此时,$v不再与$arr[0]共用同一内存地址,而是与$arr[1]共用同一内存地址
打印
array(3) { [0]=>
string(2) "bb"
[1]=>
&string(2) "bb"
[2]=>
string(2) "cc"
}
3,第三轮遍历
$v = &$arr[1];-----------
$k = 2;
$v = "cc"; //此时,由于上面$v和$arr[1]共用同一个内存地址,$v的值变成了"cc",所以$arr[1]也变成了"cc"
$v = &$arr[2];//此时,$v不再与$arr[1]共用同一内存地址,而是与$arr[2]共用同一内存地址
打印
array(3) { [0]=>
string(2) "bb"
[1]=>
string(2) "cc"
[2]=>
&string(2) "cc"
}
所以最后结果 $arr 变成了
array(3) { [0]=>
string(2) "bb"
[1]=>
string(2) "cc"
[2]=>
&string(2) "cc"
}
变形问题
<?php$arr = ["aa", "bb", "cc"];
foreach ($arr as $k => &$v) {
}
var_dump($arr);
foreach ($arr as $k => $v) {
var_dump($arr);
}
var_dump($arr);
我们来分析一下,这两个遍历
1.1 第一个遍历第一轮
$k = 0;$v = &$v;
也就是
$v = &$arr[0]; //引用传递,将$arr[0]的内存地址传递给$v,此时$v和&$arr[0]共用同一个地址,指向"aa"
1.2 第一个遍历第二轮
$v = &$arr[0];------------
$k = 1;
$v = &$arr[1]; //$v不再与$arr[0]共用内存,开始与$arr[1]共用内存,指向"bb"
1.3 第一个遍历第三轮
$v = &$arr[1];------------
$k = 2;
$v = &$arr[2]; //$v不再与$arr[1]共用内存,开始与$arr[2]共用内存,指向"cc"
第一个遍历完后,$arr 就变成了
array(3) { [0]=>
string(2) "aa"
[1]=>
string(2) "bb"
[2]=>
&string(2) "cc"
}
注意最后面的 &“cc”,说明 $v仍然和 $arr[2] 在同一个内存地址中。
第二个遍历
2.1 第一轮
$v = &$arr[2];-------
$k = 0;
$v = $arr[0]; // 由于&$arr[2]与$v共用同一内存地址,而$v被赋值为$arr[0],也就是"aa"
$arr变成
array(3) { [0]=>
string(2) "aa"
[1]=>
string(2) "bb"
[2]=>
&string(2) "aa"
}
2.2 第二轮
&$arr[2] = $v = $arr[0];$k = 1;
&$arr[2] = $v = $arr[1]; //"bb"
$arr 变成
array(3) { [0]=>
string(2) "aa"
[1]=>
string(2) "bb"
[2]=>
&string(2) "bb"
}
2.3 第三轮
&$arr[2] = $v = $arr[1];$k = 2;
&$arr[2] = $v = $arr[2]; //"bb"
$arr 变成
array(3) { [0]=>
string(2) "aa"
[1]=>
string(2) "bb"
[2]=>
&string(2) "bb"
}
以上是 数组foreach()遍历中的引用传递 的全部内容, 来源链接: utcz.com/z/515100.html