php foreach遍历时不能unset

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

场景还原

 $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的副本。

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

其他提示

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

 $value) {
    unset($arr[3]);
    $arr[4] = 40;
    $arr[10] = 100;
    
    echo $value;
}

结果依旧是一样:

01234

foreach 可用于遍历生成器

你可能感兴趣的:(php foreach遍历时不能unset)