foreach中用&的坑

本文深入探讨PHP中变量的引用和赋值操作的区别,通过多个实例解释它们如何影响数组和循环中的变量更新,帮助读者理解PHP变量机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
$a = 'abc';
$b = $a;
echo $a;//abc
echo $b;//abc
$b = 'ccc';
echo $a;//abc
echo $b;//ccc
?>


<?php
$a = $b = 'abc';
echo $a;//abc
echo $b;//abc
$b = 'ccc';
echo $a;//abc
echo $b;//ccc
?>


<?php
$a = 'abc';
$b = &$a;
echo $a;//abc
echo $b;//abc
$b = 'ccc';
echo $a;//ccc
echo $b;//ccc
?>



<?php
$a = 'aaaa';
$a1 = 'aaaa1111';

$b = &$a;
$b = 'bbbb';
echo $a; // bbbb

$b = &$c;
$b = 'aaaa';
echo $a;//bbbb
?>



<?php
//对于数组中的一个元素,作为引用赋值的情况
$arr = ['a','b','c'];
$v = &$arr[2];
$v = '111';
print_r($arr);//['a','b','111']

$arr2 = ['a', 'b', 'c'];
$v =&$arr2[2];
$v = ['222'];
print_r($arr);//['a','b','111']
?>
`

<?php
//foreach中&$v的使用情况
$arr = [1,2,3];
foreach($arr as $k => $v) {}
print_r($arr);//[1,2,3]
$v = 4;
print_r($arr);//[1,2,3]

$arr = [1,2,3];
foreach($arr as $k => &$v) {}
print_r($arr);//[1,2,3]
$v = 4;
print_r($arr);//[1,2,4]
?>

<?php
//两个foreach连续用&$v的情况
$arr = [1,2,3];
foreach($arr as $k => &$v) {}
print_r($arr);//[1,2,3]
$arr2 = [11,12,13];
foreach($arr2 as $k => &$v){}
print_r($arr);//[1,2,3]
?>





#测试题
<?php
for($i = 1; $i<=2; $i++) {
        $arr = [1,2,3];
        foreach($arr as $k => $v) {
        }
        $a[] = $arr;


        $arr = [11,12,13];
        foreach($arr as $k =>&$v) {
        }
        $b[] = $arr;
}
print_r($a);    //[ [1,2,3], [1,2,3] ]

print_r($b);    //[ [11,12,3], [11,12,13] ]

?>

 #第一次for循环
            #$arr设置为[1,2,3], $v变量被先后赋值为1,2,3, $arr不变---所以$a[0] = [1,2,3]
            #$v变量先后指向$arr[0], $arr[1], $arr[2],$v是一个引用,最后是引用了 $arr[3]的值, 但是$arr不变。--- 所以$b[0] = [11,12,13]
 #第二次for循环
            #$arr被重置为[1,2,3],【但是$v已经是一个存在的引用了,指向$b[0][2]】,$v变量被先后赋值为1,2,3, $arr不变---所以$a[1] = [1,2,3],但是此时$b[0][2]变为了3
            #$v变量先后指向$arr[0], $arr[1], $arr[2],$v是一个引用,最后是引用了 $arr[3]的值, 但是$arr不变。--- 所以$b[1] = [11,12,13]



#测试题
<?php
$a = [1,2,3];

foreach($a as $k => &$v) {
    
  $v = $v + $v;

}

var_export($a);//array ( 0 => 2, 1 => 4, 2 => 6, )


foreach($a as $k => $v) {

    $v = $v + $v;

}

var_export($a);//array ( 0 => 2, 1 => 4, 2 => 16, )                       
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值