Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP foreach引用语句:重用迭代器时的意外行为_Php_Arrays_Foreach_Pass By Reference - Fatal编程技术网

PHP foreach引用语句:重用迭代器时的意外行为

PHP foreach引用语句:重用迭代器时的意外行为,php,arrays,foreach,pass-by-reference,Php,Arrays,Foreach,Pass By Reference,此代码生成意外的输出: $array=str_split("abcde"); foreach($array as &$item) echo $item; echo "\n"; foreach($array as $item) echo $item; 输出: abcde abcdd 如果对第二个循环使用和$item,一切正常 我不明白这段代码会如何影响$array的内容。我可以认为隐式未设置($页眉)< /> >将删除最后一行,但是双 DD < /代码>来自哪里?<

此代码生成意外的输出:

$array=str_split("abcde");
foreach($array as &$item)
    echo $item;

echo "\n";
foreach($array as $item)
    echo $item;
输出:

abcde
abcdd
如果对第二个循环使用
和$item
,一切正常

我不明白这段代码会如何影响
$array
的内容。我可以认为隐式<代码>未设置($页眉)< /> >将删除最后一行,但是双<代码> DD < /代码>来自哪里?

< P>这可以帮助:

$array=str_split("abcde");
foreach($array as &$item)
    echo $item;

var_dump($array);

echo "\n";
foreach($array as $item) {
    var_dump($array);
    echo $item;
}
正如您在上一次迭代后看到的,
$item
引用了
$array
e
)的第四个元素


然后迭代数组并将第四个元素更改为当前元素。因此,在第二个循环的第一次迭代之后,它将是
abcda
,依此类推到
abcdd
。在上一次迭代中,您将第4个元素更改为第4个,如
d
更改为
d

谢谢。在第一个循环之后,是否仍要将$item与第四个元素“分离”?@lenzai:
unset($item)---取消设置引用变量是一种常见做法,只要您不再需要它来防止这种混淆。我的错误是,我认为取消设置($item)会删除$array[4]。我想我错了。@lenzai:unset总是破坏引用。如果您有
$a=1;取消设置($a)
它会破坏内存中对
1
的唯一引用。只要没有任何其他引用-
1
就不能再使用任何变量名访问,因此您将其视为“unset”。因此,可以将unset看作是“一些中断变量名和内存之间的互连,但不修改内存的构造”事实上,foreach()的文档专门谈到了这一点:“即使在foreach循环之后,$value和最后一个数组元素的引用仍然存在。建议使用unset()销毁它。”