PHP

解决php foreach值引用问题 - 为什么php foreach值引用导致值不正确

silverwq
2022-06-01 / 0 评论 / 223 阅读 / 正在检测是否收录...

示例一

使用引用,可以方便快速的修改数组元素,但是,当 foreach 的元素变量名称一样的时候,例如下例变量名称都是引用类型的话,将引发一些问题。

$array1 = [1, 2, 3];
// 执行完这个语句后,$value始终指向$array[2]这个元素
foreach ($array1 as &$value) {} // $array = [1,2,3]
$array2 = $array1;// 就连$value的引用也复制了过来,详细见示例二
foreach ($array2 as $value) {//array1和array2的第3个元素都会被修改
    // 第1次循环之后$array=[1,2,1]
    // 第2次循环之后$array=[1,2,2],此时数组的第三个元素变成了倒数第二个元素,然后作为下一次循环
    // 第3次循环之后$array=[1,2,2]
}
var_dump($array1);// [1,2,2]
var_dump($array2);// [1,2,2]

所以针对这个问题,同一个作用域里,foreach的变量不能一样。

示例二

如果先对数组元素进行引用,然后再赋值给另外一个变量,那么两个数组的的这个元素,再内存中是共用一块地址的,对引用变量的修改,会影响到多个数组

$array1 = [1, 2, 3];
$value = &$array1[2];
$array2 = $array1;
$value = 33;

print_r($array1); // [1,2,33]
print_r($array2);// [1,2,33]

如果先复制然后在引用,就不会有这个问题,也就是说,数组复制的时候,要注意数组的元素有没被引用

$array1 = [1, 2, 3];
$array2 = $array1;
$value = &$array1[2];
$value = 33;

print_r($array1); // [1,2,33]
print_r($array2);// [1,2,3]

示例三

如下代码

$arr = array('a1', 'a2', 'a3');
foreach ($arr as $key => $value) {
    // $value是$arr[$key]的引用,修改$value的值会修改$arr[$key]的值
    $value = &$arr[$key];
    print_r($arr);
}
print_r($arr);

输出结果是

Array
(
    [0] => a1
    [1] => a2
    [2] => a3
)
Array
(
    [0] => a2
    [1] => a2
    [2] => a3
)
Array
(
    [0] => a2
    [1] => a3
    [2] => a3
)
Array
(
    [0] => a2
    [1] => a3
    [2] => a3
)

如果不想受到影响,可以在$value上加个&,这样每次foreach的时候,会断开原来的引用,重新对新的数组元素进行引用

$arr = array('a1', 'a2', 'a3');
foreach ($arr as $key => &$value) {
    // $value是$arr[$key]的引用,修改$value的值会修改$arr[$key]的值
    $value = &$arr[$key];
    print_r($arr);
}
print_r($arr);
0

评论 (0)

取消