4

为什么我不能在foreach循环中取消设置变量?

<?php

$array = array(a,s,d,f,g,h,j,k,l);

foreach($array as $i => $a){
 unset($array[1]);
 echo $a . "\n";
}

print_r($array);

代码中,变量在循环内的范围内foreach,但在循环外它是未设置的。是否可以在循环内取消设置?

4

3 回答 3

8

您需要通过引用传递数组,如下所示:

foreach($array as $i => &$a){

注意添加的&. 这在foreach的手册中也有说明:

为了能够直接修改循环内的数组元素,在 $value 之前加上 &。在这种情况下,该值将通过引用分配。

这现在产生

a
d
f
g
h
j
k
l
Array
(
    [0] => a
    [2] => d
    [3] => f
    [4] => g
    [5] => h
    [6] => j
    [7] => k
    [8] => l
)
于 2012-06-28T12:53:36.507 回答
4

在数组的foreach副本上执行,而不是引用,以便在执行期间更容易处理数组(例如您的)中更剧烈的变化。

于 2012-06-28T12:53:48.380 回答
2

foreach在访问循环内的代码块之前,遍历数组并将键分配给 $i 并将值分配给 $a。该数组实际上是在迭代之前由函数“复制”的,因此对原始数组的任何更改都不会影响循环的进行。

您还可以通过引用将 $array 传递到 foreach 中,$i => &$a而不是按值传递,这将允许数组的突变。

另一种选择是直接在数组上工作,你会看到一些不同的东西:

for($x=0;$x<count($array);$x++){
    unset($array[1]);
    // for $x=1 this would result in an error as key does not exist now
    echo $array[$x];
}

print_r($array);

当然,这假设您的数组是按数字顺序键控的。

于 2012-06-28T12:56:43.353 回答