首页 > 后端开发 > php教程 > php foreach 循环中里面的元素被删。会影响循环吗?

php foreach 循环中里面的元素被删。会影响循环吗?

WBOY
发布: 2016-06-06 20:29:31
原创
1334 人浏览过

<code>foreach($items as item){
    //在$items里面删除$item会影响循环的次数莫???
}
</code>
登录后复制
登录后复制

因为我的这个$items数组很长。里面的每个item我只需要使用一次。然后就不会使用了。
我的想法就是使用一个删除一个。这样循环的元素就会越来越少。这个循环的运行时间就会比原来短。这种认识合理莫???

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
测试的时候这个错误如何解???

回复内容:

<code>foreach($items as item){
    //在$items里面删除$item会影响循环的次数莫???
}
</code>
登录后复制
登录后复制

因为我的这个$items数组很长。里面的每个item我只需要使用一次。然后就不会使用了。
我的想法就是使用一个删除一个。这样循环的元素就会越来越少。这个循环的运行时间就会比原来短。这种认识合理莫???

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
测试的时候这个错误如何解???

How 'foreach' actually works

这个上面的回答很有深度,表示没怎么看明白,但是还是给题主献上。

不会的、实际行动告诉你。

<code><?php $items = [1,2,3,4,5];
foreach ($items as $key => $value) {
    unset($items[$key]);
    print_r($items);
}
print_r($items);
</code>
登录后复制
<code>//循环开始
Array ( [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 
Array ( [2] => 3 [3] => 4 [4] => 5 ) 
Array ( [3] => 4 [4] => 5 ) 
Array ( [4] => 5 ) 
Array ( ) 
//循环结束
Array ( )
</code>
登录后复制

这个时间不会节省吧,每次循环都要对数组剔除,取数组[0],这时间会比每次循环直接取数组[i]来的更浪费吧

要想知道结果,最好的方式就是亲自实践一下!

不会吧,游标还是会一直往前推进呀

不会,数组在遍历的时候是使用的其一个副本

<code>foreach($items as $key=>item){
    unset($items[$key])
}
</code>
登录后复制

并不会啊,自己动手实践一下就知道了

并不会删除,foreach在循环的时候,数组下标不断向前推,你操作一个删除一个并不会影响。

但是,我想说,这样操作对楼主所说的很长的数组操作有速度上的优化吗?好像并没有!

不必要删除...
foreach的实现方式是借助数组的内部指针的...你遍历完这一个,指针就向后移动一个,所以你删除前面的值对这个根本就没影响,反而会破坏这个数组,比如遍历后还要用到这数组呢,而且删除的过程虽然消耗时间不多,但也是要消耗的...

这样做并不能减少内存啊。不过可以试试array_shift()或者 array_pop()那个函数,后者要比前者快。如果能考虑一下分治就更好了

如果你的数组过大,确实有溢出风险,但是你删除元素浪费的性能更多。

如果你的php version >= 5.5,建议使用php的新特性Generators。使用这种方法的优点是它可以让你在处理大数据集合的时候不用一次性的加载到内存中。甚至你可以处理无限大的数据流。

默认是不会删除的,因为是按照值来传递的.如果采用"&"进行引用传递的,那么就会直接删除原来的数组.

并不会被删除。
对于大数组来讲我同意hongchao的看法yield可以帮助你用更少的内存来完成遍历任务,但用的时间会更久。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes)
测试的时候这个错误如何解???

这个错误是你循环的时候php使用的的内存不够了 134217728=128M 建议调整php.ini里面的memory_limit配置

第一,你的遍历完一个删一个的思想不但不会优化程序性能,反而会增加负担,因为for each 遍历是内部指针推动的操作,过程是自动的,耗能很低,而你的想法是每操作完一次删一个元素对这个指针推进过程没有丝毫帮助,反而新增性能负担,因为删除元素也需要一点性能,放大后这些不必要的性能支出就变成一个不必要的累赘了; 第二,提示说明你的内存只有128m,不够用哦

foreach 循环每次都会复制把变量的值复制一遍循环。

相关标签:
php
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板