$array = array('1','3','20','10');
foreach ($array as $i=>$arr) {
if ($i==0) unset($array[$i]);
}
问题:删除一个元素会破坏此循环迭代的顺序吗?当我删除索引小于/等于/大于当前迭代索引的元素时会发生什么?
在迭代原始数组时修改原始数组应该避免做什么?
编辑:如果数组是通过引用传递的?
答案 0 :(得分:1)
特别是您提供的代码,一次
$array = array('1','3','20','10');
声明,键被绑定,所以
if($i==0) unset($array[$i]);
只会取消设置'1'
,您将被留下
array(2) {
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
正如@cleong所说,PHP似乎在迭代时创建了一个数组副本:
$arr=array("1","2","3");
foreach($arr as $idx=>$val)
{
if(isset($arr[1])) unset($arr[1]);
echo $val."\n";
}
var_dump($arr);
将返回
1
2
3
array(2) {
[0]=>
string(1) "1"
[2]=>
string(1) "3"
}
因此,只要unset
不会产生错误(例如,取消设置已经未设置的变量),在迭代中取消设置元素就可以了“OK”。
但是,我认为这不是一个好主意。如果您的问题是“如何避免这种情况”,会提供您必须执行此操作的示例。
答案 1 :(得分:0)
当您使用foreach循环()时,PHP会创建数组的副本。即使你完全吹掉阵列,迭代也会继续,因为没有发生任何事情。即:
$array = array("a", "b", "c");
foreach($array as $element) {
$array = null;
echo "$element ";
}
输出:
a b c