在php7.0 Ubuntu16.04环境中,在对foreach遍历时不能对正在遍历的数组进行删除元素,修改元素,增加元素操作,因为这些操作并不能对正在遍历的数组产生影响。
场景还原
<?php
$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的副本。
当然这只是我的猜想...
其他提示
对正在被遍历的数组进行添加元素或者修改元素的操作跟删除元素的操作是一样的,不会对正在被遍历的数组产生影响。
<?php
$arr = [0, 1, 2, 3, 4]; // 一维数组,包含5个元素
foreach ($arr as $key => $value) {
unset($arr[3]);
$arr[4] = 40;
$arr[10] = 100;
echo $value;
}
结果依旧是一样:
01234