我有这样的代码:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.PHP_EOL;
}
有人能解释一下为什么输出是: 零一二二。
来自zend认证学习指南。
我有这样的代码:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.PHP_EOL;
}
有人能解释一下为什么输出是: 零一二二。
来自zend认证学习指南。
当前回答
我发现这个例子也很棘手。为什么在最后一次迭代的第二个循环中什么都没有发生($v保持' 2 '),是因为$v指向$a[3](反之亦然),所以它不能给自己赋值,所以它保持之前赋值:)
其他回答
这个问题提供了很多解释,但没有明确的例子说明如何解决这种行为导致的问题。在大多数情况下,您可能需要在通过引用foreach传递的代码中使用以下代码。
foreach ($array as &$row) {
// Do stuff
}
// Unset to remove the reference
unset($row);
因为在第二个循环中,$v仍然是对最后一个数组项的引用,所以它每次都会被覆盖。
你可以这样看:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.'-'.$a[3].PHP_EOL;
}
如你所见,最后一个数组项接受当前循环值:'zero', 'one', 'two',然后它只是'two'…:)
这样的:
$a = array ('zero','one','two', 'three');
foreach ($a as &$v) {
}
foreach ($a as $v) {
echo $v.PHP_EOL;
}
和
$a = array ('zero','one','two', 'three');
$v = &$a[3];
for ($i = 0; $i < 4; $i++) {
$v = $a[$i];
echo $v.PHP_EOL;
}
OR
$a = array ('zero','one','two', 'three');
for ($i = 0; $i < 4; $i++) {
$a[3] = $a[$i];
echo $a[3].PHP_EOL;
}
OR
$a = array ('zero','one','two', 'three');
$a[3] = $a[0];
echo $a[3].PHP_EOL;
$a[3] = $a[1];
echo $a[3].PHP_EOL;
$a[3] = $a[2];
echo $a[3].PHP_EOL;
$a[3] = $a[3];
echo $a[3].PHP_EOL;
因为如果您创建了一个变量的引用,那么该变量的所有名称(包括原始名称)都将成为引用。
我是偶然来到这里的,而警官的问题引起了我的注意。不幸的是,我不明白高层的任何解释。在我看来,每个人都知道它,明白它,接受它,只是无法解释。
幸运的是,PHP文档中关于foreach的一句话完全说明了这一点:
警告:即使在foreach循环之后,$值和最后一个数组元素的引用仍然存在。建议使用unset()来销毁它。