foreach ($veryFatArray as $key => $value) {
將在foreach引用賦值背後的關鍵$價值爲$值,或將$值是一個什麼樣的存儲陣列中的副本?如果是的話,我怎樣才能得到一個參考?數組值存儲大量的數據,因此複製它們並不是很好。
foreach ($veryFatArray as $key => $value) {
將在foreach引用賦值背後的關鍵$價值爲$值,或將$值是一個什麼樣的存儲陣列中的副本?如果是的話,我怎樣才能得到一個參考?數組值存儲大量的數據,因此複製它們並不是很好。
不要嘗試和猜測解釋者是這裏故事的寓意。 $value
實際上是副本,但是是高效的副本。 PHP使用按值傳遞(對於非對象),但也使用了寫時複製。這意味着如果你寫:
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 copy-on-write的所有想知道的事情。
$value
將是一個副本,但(如果我在這裏錯了,請別人糾正我),PHP實際上是非常聰明的傳遞值類型的東西。它實際上會做一個通過引用傳遞,如果你修改這個變量,它只會複製。例如:
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
讀,不寫它,那麼它應該不成問題。