这个foreach会复制内存中的值吗?

时间:2010-01-05 01:45:13

标签: php

示例:

foreach ($veryFatArray as $key => $value) {

foreach会通过引用$ value来分配$ key后面的值,还是$ value是存储在数组中的内容的副本?如果是,我怎么才能得到参考?数组值存储了大量数据,因此复制它们并不是很好。

2 个答案:

答案 0 :(得分:6)

不要试着再猜测翻译是这里故事的寓意。 $value实际上是一个副本,但却是一个有效的副本。 PHP使用pass-by-value(对于非对象),但也使用copy-on-write。这意味着如果你写:

foreach ($bigitems as $bigitem) {
  echo $bigitem;    // uses original
  $bigitem = 'foo'; // item copied and assigned 'foo'
  echo $bigitem;    // uses copy
}

只是声明你的意图:你想使用数组值。让PHP在此之后对其进行排序。如果您打算更改数组,基本上只使用循环中的引用。否则,您将错误的消息发送给读取您代码的其他人。

Copy-on-Write in the PHP Language的第1部分应该告诉您关于PHP写时复制的所有信息。

答案 1 :(得分:4)

$value将是一个副本,但是(如果我在这里错了,请有人纠正我),PHP实际上非常聪明的值传递类型的东西。它实际上会执行pass-by-reference,只有在修改变量时才会复制。例如:

function foo ($bar) {
    echo $bar['x'];
    // internally, $bar is a reference to $baz. (virtually) no extra memory used
    $bar['y'] = 'Y';
    // only now has the array been copied in memory
}

$baz = array('x' => '1', 'y' => '2');
foo($baz);

foreach中,如果要修改原始数组,可以执行以下操作:

// PHP 4
foreach (array_keys($veryFatArray) as $key) {
    $value =& $veryFatArray[$key];
    // ...
}

// PHP 5
foreach ($veryFatArray as $key => &$value) { }

如果您只是从$value阅读而不是写信给它,那么这应该不是问题。