$array = array(1, 2, 3, 4);
foreach ($array as $value) {
//here $value is 1, then 2, then 3, then 4
}
//here $value will continue having a value of 4
//but if you change it, nothing happens with your array
$value = 'boom!';
//your array doesn't change.
因此没有必要取消设置$value
第二种情况(通过参考):
$array = array(1, 2, 3, 4);
foreach ($array as &$value) {
//here $value is not a number, but a REFERENCE.
//that means, it will NOT be 1, then 2, then 3, then 4
//$value will be $array[0], then $array[1], etc
}
//here $value it's not 4, it's $array[3], it will remain as a reference
//so, if you change $value, $array[3] will change
$value = 'boom!'; //this will do: $array[3] = 'boom';
print_r ($array); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => boom! )
4条答案
按热度按时间3wabscal1#
我知道这篇文章是旧的,但我认为这个信息是非常重要的:你问:
当foreach循环后$value仍然存在时,是否需要unset($value),这是一个好的做法?
这取决于你是按值迭代还是按引用迭代。
第一种情况(按值):
因此没有必要取消设置$value
第二种情况(通过参考):
所以在这个例子中,**取消$value是一个很好的做法,因为这样做会破坏对数组的引用。**有必要吗?**没有,但是如果你不这样做,你应该非常小心。
它可能会导致如下所示的意外结果:
这对PHP 7.0也有效
未设置的相同代码:
我希望这对将来的某个人有用。:)
wljmcqd82#
没有必要在当前使用
unset
的上下文中使用它。unset
只会破坏变量及其内容。在你给出的例子中,这是循环遍历一个数组,创建
$value
,然后你取消设置这个变量,这意味着它不再存在于代码中,所以这完全没有任何作用。为了形象化我所说的内容,请看下面这个例子:
以下输出将为:
因此,您将首先看到
Hello World
,但在取消设置该变量后,尝试调用它将只会导致错误。要回答你的问题,你真的不需要取消价值;不需要它,因为
foreach
循环正在设置每个array() + 10
的$value
。取消设置它将导致工作被删除和遗忘。
5us2dqdw3#
我可以看到不设置$value的一个原因是为了确保你不会在同一个脚本中无意中使用它。我刚刚处理了一个真正令人困惑的bug,这个bug是由于将一个循环中的几行代码复制到另一个循环中而引起的。并且它使用来自第一循环的$value的最终值。至少如果我取消了它,我会得到一个有用的错误消息,由于试图访问一个不存在的变量。
bvjxkvbb4#
你可能泄露了***
"&"
***。