1. 云栖社区>
  2. PHP教程>
  3. 正文

foreach对数组指针的影响

作者:用户 来源:互联网 时间:2017-12-01 12:32:41

指针数组影响

foreach对数组指针的影响 - 摘要: 本文讲的是foreach对数组指针的影响, 问题描述:遍历数组时,改变了数组的值,数组遍历完成后,数组的指针指向了第二个元素 <?$arrD = array('0'=>'a','1'=>'b','2'=>'c');echo key($arrD)."<

问题描述:遍历数组时,改变了数组的值,数组遍历完成后,数组的指针指向了第二个元素

<?$arrD = array('0'=>'a','1'=>'b','2'=>'c');echo key($arrD)."</br>";foreach($arrD as $intK => $val){     $arrD[] = $val."2";}echo(key($arrD));?>

输出结果如下:

01

因此再次通过指针遍历数组的时候会发现$arrD的第一个值就循环不出来了。


其实问题很好解决,在foreach之后,直接用reset()方法将$arrD的指针重置一下就可以了,但导致问题的原因才是值得关注的,在做了一些搜索和阅读的工作之后,总结问题原因如下,首先,先知道几个php处理赋值遍历等动作的原则:

1,php在变量赋值时候的内存使用策略:写时复制(copy on write, COW),当用赋值方法把一个变量值赋给另一个变量时,由于这两个变量值相同,因此公用同一内存,当其中一个变量值发生变化时候,才会重新为值变化的变量申请内存,已达到节省内存的目的;

2,foreach遍历数组时,实际上是遍历的数组的一个拷贝,并且在开始遍历之前会把指针指向拷贝的开始;


针对规则1 的验证

<?echo "初始内存情况:".memory_get_usage()."</br>";$foo = str_repeat('aaa', 10000);echo "使用变量/$foo之后的内存:".memory_get_usage()."</br>";$bar = $foo;echo "将变量/$foo拷贝给/$bar后的内存:".memory_get_usage()."</br>";$bar = str_repeat('aaa', 10000);echo "对/$bar值修改后使用的内存:".memory_get_usage()."</br>";?>
输出结果如下:

初始内存情况:118912使用变量$foo之后的内存:149008将变量$foo拷贝给$bar后的内存:149056对$bar值修改后使用的内存:179104


针对规则2的验证

<?    $a = array('a','b','c');    next($a);    foreach($a as $v)    {        $a[] = 'd';        echo $v."</br>";    }?>

输出结果如下

abc







以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针 , 数组 影响 ,以便于您获取更多的相关知识。