2012-06-28 40 views
4

为什么我不能在foreach循环中取消设置变量?为什么我不能在`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环内的范围,但在循环外它是未设置。是否有可能在循环中取消设置?

+7

在几乎每一个编程语言,这是一个坏主意,修改数据收集,同时遍历它。 –

+1

我记得你需要通过ref来设置数组:foreach(&$ array as $ i => $ a){' –

+0

[在foreach循环中取消设置数组元素]的可能的重复(http:// stackoverflow的.com /问题/ 3054886 /复位-AN-阵列元件内-A-的foreach环)[foreach循环内取消设置数组元素(的 –

回答

8

您需要通过引用传递数组,像这样:

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

注意添加&。这也是本说明书中所述的用于foreach

为了能够直接修改环路 上一页$值内的数组元素与&。在这种情况下,该值将由 参考分配。

现在这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 
) 
4

foreach执行的阵列,而不是一个引用的副本,使之更容易处理阵列中时更剧烈的变化(比如你的)执行。

2

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

您也可以通过引用将$ array传入到使用$i => &$a的foreach中,而不是通过将允许数组变化的值传递给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); 

当然,这是假设你的数组是数字和顺序键。

相关问题