Heim  >  Artikel  >  Backend-Entwicklung  >  php foreach为什么要复制一个数组出来操作

php foreach为什么要复制一个数组出来操作

WBOY
WBOYOriginal
2016-08-18 09:16:291187Durchsuche

目的是什么 求过程

回复内容:

目的是什么 求过程

啥意思啊!恕我愚钝,你要表达什么意思啊?

PHP foreach 不需要复制一个数组出来操作,你从哪里看到的需要复制一个数组?

PHP foreach遍历的是数组的副本,我想大概是为了避免你一边遍历一边修改(添加项)导致死循环?
随便猜测的。。。

题主是想知道foreach的内部实现时, 是复制了一个临时变量来操作, 而不是操作实际的数组吧

我对这个问题一直很懵懂, 以下回答仅供参考, 啊哈哈

参考 深入理解php内核

<code> [鸟哥的php foreach](http://www.laruence.com/2008/11/20/630.html)
 </code>

来看一个列子证明foreach在循环是确实是复制了一个临时变量来操作的

<code class="php">
$arr = array(1,2,3,4,5);

//该数组的下一元素为 2
echo next($arr);//2

//该数组的最后元素为 5
echo end($arr);//5

//即使上一步调用end将数组指针移到最后一位, 但在foreach开始执行时, 会重置数组指针
foreach($arr as $key => $row) {
    next($arr);
    end($arr);
    echo $key, '=>', $row, "\r\n";//
}
</code>

结果如下所示

<code class="php">2
5
0=>1
1=>2
2=>3
3=>4
4=>5
</code>

如上, foreach在循环开始前, 调用nextend时, 会改变数组指针位置,而在foreach里面调用时,其循环过程不变

在遍历的代码中通过end,next等操作数组的指针,数组的指针不会变化,这是因为在PHP内核进行FETCH操作时, 会通过中间变量存储当前操作数组的内部指针,每遍历一个元素,会先获取之前存储的指针位置,获取下一个元素后,再恢复指针位置, 关键在于FETCH OPCODE执行过程中的中间变量

这里就可以看出foreach在循环时不时操作的原数组, 而是原数组的拷贝,

好现在来回答题主的问题, 为什么要copy一个数组来操作而不是操作原数组, 我的想法是, 若foreach操作的是原数组, 那么在foreach里改变原数组的值, 或新增元素, 那么会怎样呢,题主这样想是不是就能明白了,

<code class="php">foreach ($variable as $key => $value) {
    $variable[''] => mt_rand(1, 111);
}</code>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn