Why does foreach copy the array when we did not modify it in the loop? [duplicate]

北城以北 提交于 2019-12-10 01:20:42

问题


In a blog post "PHP Internals: When does foreach copy", NikiC stated that in a code like this:

Snippet 1

$array = range(0, 100000);
foreach ($array as $key => $value) {
    xdebug_debug_zval('array'); // array is not copied, only refcount is increased
}

foreach will not copy the array because the only thing that foreach modifies about $array is it's internal array pointer.

He also stated that in a code like this:

Snippet 2

$array = range(0, 100000); // line 1
test($array);
function test($array) { 
    foreach ($array as $key => $value) { // line 4
        xdebug_debug_zval('array'); // array is copied, refcount not increased
        // ...
    }
}

foreach will copy the array because if it didn't, the $array variable in line 1 would be changed.

However, the only thing that foreach modifies about $array is it's internal array pointer. So why does it matter if the internal array pointer of the $array variable in line 1 is changed? It didn't matter in snippet 1, why did it matter in snippet 2?

Why does foreach need to copy the array in snippet 2, even though we did not modify it in the loop?


回答1:


That is because in the second case, $array is passed by value to the function test(). Hence, a copy of the $array was made inside the function, and the foreach() works on the copy. Things will be different if the $array is passed by reference to the function test().

For information on pass by value vs pass by reference, see this question




回答2:


Your question is answered in the article you linked to. It is given in the section

Not referenced, refcount > 1

with the explanation that a copy of the structures is needed because the array pointer moves, and this must not affect the outside array.



来源:https://stackoverflow.com/questions/18173176/why-does-foreach-copy-the-array-when-we-did-not-modify-it-in-the-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!