0
$array = array('1','3','20','10');
foreach ($array as $i=>$arr) {
   if ($i==0) unset($array[$i]);
}

问题:删除一个元素会扰乱这个循环的迭代顺序吗?当我删除索引小于/等于/大于当前迭代索引的元素时会发生什么?

在迭代原始数组时修改原始数组时应该避免做什么?

编辑:如果数组是通过引用传递的?

4

2 回答 2

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不会产生错误(例如取消设置已经取消设置的变量)。

但是,我认为这不是一个好主意。如果您的问题是“如何避免这种情况”,请举例说明您为什么必须这样做

于 2012-08-30T11:17:25.850 回答
0

当您使用 foreach loop() 时,PHP 会创建一个数组的副本。即使您完全清除了数组,迭代也会继续进行,就像什么都没发生一样。以机智:

$array = array("a", "b", "c");

foreach($array as $element) {
    $array = null;
    echo "$element ";
}

输出:

a b c
于 2012-08-30T10:37:07.570 回答