为什么我不能在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
循环中的范围内,但在循环之外它是未设置的。是否有可能在循环中取消它?
答案 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);
当然,这假设您的数组是按数字顺序键入的。