如何在PHP的foreach中传递项目作为引用?

时间:2013-06-24 16:33:03

标签: php parameters foreach

如果我需要更改一个函数参数,我可以使用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);

3 个答案:

答案 0 :(得分:1)

首先,这在技术上不是指针。这是一个参考。在您的代码中使用它们之前,我建议您通过阅读the manual section that explains them来熟悉它们在PHP中的工作方式。

在这种情况下,您的代码实际上是正确的,如the manual page for foreach中所述。 foreach($x as &$i)正是这样做的方法。您的混淆显然来自var_dump

的输出
&int(1)

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

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

答案 1 :(得分:0)

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

做这样的事情会更安全:

foreach($x as $k=>$v) {
    $x[$k] = 1;
}

答案 2 :(得分:0)

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

阅读指南

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

$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;
}

如果没有使用$值,则更喜欢使用简单的for(如果数组关联则使用array_keys