1

如果我需要更改函数参数,我可以使用foo(&$x)并且函数可以修改它。我在 foreach 循环中需要这样的东西,

 $x=array(1,2,3);
 foreach($x as &$i) $i=1;
 var_dump($x);

结果有一些奇怪的“&int(1)”......

 array(3) {
   [0]=>
   int(1)
   [1]=>
   int(1)
   [2]=>
   &int(1)
 }

但是,当然,这不是语法(对于我想要的)......可以用 PHP 做到这一点吗?


使用起来并不“那么优雅” for(现在可以了!),

 $x=array(1,2,3);
 for($i=0; $i<count($x); $i++) $x[$i]=1;
 var_dump($x);
4

3 回答 3

1

首先,这在技术上不是一个指针。这是一个参考。在您的代码中使用它们之前,我建议您通过阅读解释它们的手册部分来熟悉它们在 PHP 中的工作方式。

在这种情况下,您的代码实际上是正确的,foreach. foreach($x as &$i)正是这样做的方法。您的困惑显然​​来自以下输出var_dump

&int(1)

这正是您应该期待的。&表示另一个变量是指向该值的引用。这是因为$i即使在循环结束后仍然是对数组中最后一个元素的引用。这有潜在的危险,因为文件中其他地方的代码可能会修改$i,因此您的数组可能会在您不希望的情况下修改。

unset $i在循环结束后避免这种情况可能是一个好习惯。

于 2013-06-24T17:06:55.473 回答
0

我的作业在评论中得到了很好的评论和回答。

阅读指南

正如@lonesomeday 所说,“这正是正确的语法”。PHP指南显示

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value)
    $value = $value * 2;
unset($value); // break the reference with the last element

并且,正如@Wrikken 所说,需要unset.

不确定时使用“中级优雅”

正如@MarcB20 所说,小心..."foreach($x as &$i) $i=1;是非常危险的。 $i将在您的代码期间(或直到您取消设置它)保留引用,并且您可以通过在其他一些变量中重用变量来不知不觉地修改数组的内容未来的背景”...

因此,您可以使用“中级优雅”语法,

foreach ($arr as $key=>$value) {
    // ... use $value ...
    $arr[$key] = $anothervalue;
}

如果 $value 未使用,则更喜欢使用简单for(与array_keys数组关联)。

于 2013-06-24T17:15:34.960 回答
0

当循环结束时,迭代器仍然保存最后使用的值。在这种情况下,数组中的最后一项。所以还是被引用了。除非您稍后尝试重用,否则这并不重要$i,在这种情况下,您可能会得到一些奇怪的结果。

这样做会更安全:

foreach($x as $k=>$v) {
    $x[$k] = 1;
}
于 2013-06-24T17:02:03.747 回答