php 遍历数组去掉指定数据,php foreach遍历时不能unset

在php7.0 Ubuntu16.04环境中,在对foreach遍历时不能对正在遍历的数组进行删除元素,修改元素,增加元素操作,因为这些操作并不能对正在遍历的数组产生影响。

场景还原

$arr = [0, 1, 2, 3, 4]; // 一维数组,包含5个元素

foreach ($arr as $key => $value) {

if (0 === $key) {

unset($arr[3]); // 删除第4个元素

}

echo $key;

}

理论结果

0124

实际结果

01234

分析

在我的常规理解中,unset可以删除数组中的指定元素,确实,unset是把数组$arr中的指定元素$arr[3]给删除了(不相信的话,可以把$arr数组打印出来看一看)。

既然$arr[3]这个元素被删除,为什么在遍历的时候还会出现??

我的猜想是:foreach在遍历的时候,会先把$arr数组拷贝一份,保证被遍历的数组 在遍历的过程中 数据的完整性,确保在遍历的时候不会被修改。所以我们使用unset去删除数组元素的时候,其实并不是删除正在被遍历的数组,而是在操作$arr变量。

也就是说:被遍历的数组 !== $arr,被遍历的数组 === $arr的副本。

当然这只是我的猜想...

其他提示

对正在被遍历的数组进行添加元素或者修改元素的操作跟删除元素的操作是一样的,不会对正在被遍历的数组产生影响。

$arr = [0, 1, 2, 3, 4]; // 一维数组,包含5个元素

foreach ($arr as $key => $value) {

unset($arr[3]);

$arr[4] = 40;

$arr[10] = 100;

echo $value;

}

结果依旧是一样:

01234

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值