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

时间:2012-06-28 12:50:57

标签: php

为什么我不能在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);

the code中,变量在foreach循环中的范围内,但在循环之外它是未设置的。是否有可能在循环中取消它?

3 个答案:

答案 0 :(得分:8)

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

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

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

  

为了能够直接修改循环内的数组元素   使用&amp;前面的$ value。在这种情况下,值将由   参考

现在produces

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
)

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

你也可以使用$i => &$a通过引用将$数组传递给foreach,而不是通过允许数组变异的值。

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

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);

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