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

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循环内部范围内,但在循环外部它被取消设置。是否可以在循环内取消设置它?

7
在几乎所有编程语言中,当您迭代集合时修改它是一个不好的想法。 - Anthony Grist
1
据我回忆,您需要通过引用设置数组:foreach(&$array as $i => $a){ - Brett Zamir
这里的被接受的答案是对实际发生和原因的适当解释。简而言之,foreach是一种写时复制(Copy-on-Write)技术。 - DaveRandom
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
)

4
< p > foreach 执行的是数组的副本,而不是引用,这样可以更容易地处理执行过程中对数组所做的更彻底的改变(如您所做的更改)。< /p >

2
foreach循环遍历数组,并在访问循环内部的代码块之前将键分配给$i并将值分配给$a。函数实际上在迭代之前会对数组进行“复制”,因此对原始数组的任何更改都不会影响循环的进展。
您也可以使用$i => &$a将$array作为引用传递到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);

当然,这前提是你的数组具有数值和连续的键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接