php 2次foreach循环的坑

已知数组:

$arr = ['a','b','c'];
在没有对数组进行 &地址引用的情况下,foreach循环两次后$arr数组的值是不会改变,这点毋庸置疑。
foreach ($arr as $v){}
foreach ($arr as $v){}

案例1: 首次循环加一个&取地址遍历,不unset


echo "第1次循环\n";
foreach ($arr as &$v){
    echo "{$v}\n";
}
echo "第2次循环\n";
foreach ($arr as $v){
    echo "{$v}\n";
}

print_r($arr);

// 输出1次循环
a
b
c
第2次循环
a
b
b

$arr 最后的值为:
Array
(
    [0] => a
    [1] => b
    [2] => b
)

案例2:首次循环加一个&取地址遍历,加一个unset($v)


echo "第1次循环\n";
foreach ($arr as &$v){
    echo "{$v}\n";
}
unset($v);
echo "第2次循环\n";
foreach ($arr as $v){
    echo "{$v}\n";
}

print_r($arr);

// 输出又变正常了,1次循环
a
b
c
第2次循环
a
b
c

$arr 最后的值为:
Array
(
    [0] => a
    [1] => b
    [2] => c
)

原因分析:
取官方手册里说明:
在这里插入图片描述

回到案例1中, a r r 数组,第一次 f o r e a c h 循环结束后 , arr 数组,第一次foreach循环结束后, arr数组,第一次foreach循环结束后,v指向的是$arr中的最后一个元素,也就是 a r r [ 2 ] ;在第二次循环时候,每次 arr[2]; 在第二次循环时候,每次 arr[2];在第二次循环时候,每次v的值也是赋值给$arr[2]改变其中的值,把值的变动过程打印出来:

$arr = ['a','b','c'];

echo "第1次循环\n";
foreach ($arr as &$v){
    echo "{$v}\n";
}
//unset($v);
echo "第2次循环\n";
foreach ($arr as $v){
    echo "{$v}\n";
    print_r($arr);
}

// 输出:1次循环
a
b
c
第2次循环
a
Array
(
    [0] => a
    [1] => b
    [2] => a
)
b
Array
(
    [0] => a
    [1] => b
    [2] => b
)
b
Array
(
    [0] => a
    [1] => b
    [2] => b
)

第一次遍历, 将 arr[0] 赋值给 $v, 相当于 arr[2]=arr[0], 此时 arr 为: [‘a’, ‘b’, ‘a’]

第二次遍历, 将 arr[1] 赋值给 $v, 相当于 arr[2]=arr[1], 此时 arr 为: [‘a’, ‘b’, ‘b’]

第三次遍历, 将 arr[2] 赋值给 $v, 相当于 arr[2]=arr[2], 此时 arr 为: [‘a’, ‘b’, ‘b’]

所以遍历出异常了,保险起见,foreach循环的$v最好都unset掉。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值