【发布时间】:2012-01-03 11:00:43
【问题描述】:
我正在编写的一个简单的 php 脚本出现了一些非常奇怪的行为。我将其减少到重新创建错误所需的最低限度:
<?php
$arr = array("foo",
"bar",
"baz");
foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);
foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has changed....why?
?>
这个输出:
Array
(
[0] => foo
[1] => bar
[2] => baz
)
Array
(
[0] => foo
[1] => bar
[2] => bar
)
这是一个错误还是应该发生的一些非常奇怪的行为?
【问题讨论】:
-
再按值做,看第三次有没有变化……?
-
@Shackrock,它似乎不再随着按值重复循环而改变。
-
有趣的是,如果您将第二个循环更改为使用 $item 以外的其他内容,那么它会按预期工作。
-
总是取消设置循环体末尾的项目:
foreach($x AS &$y){ ... unset($y); }-- 它实际上在 php.net 上(不知道在哪里),因为这是一个很大的错误。 -
PHP 手册建议在第一个 foreach 循环之后调用
unset($item);以避免此问题。 php.net/manual/en/control-structures.foreach.php
标签: php arrays loops reference