数组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

回到顶部