Graent.Hu 的博客

新浪微薄腾讯微薄

最新碎语:最近感觉有些迷茫,怎么办~

您的位置:Graent.Hu 的博客 >PHP编程> PHP foreach原理详解

PHP foreach原理详解

timg.jpg

一、foreach简介

1.foreach的遍历顺序
如果是索引数组,你会发现遍历出来的顺序并不是按索引大小遍历,而是按添加的顺序,如果按照索引大小遍历,应该使用for,而不是foreach

$arr[2]='中';
$arr[1]='国'; foreach($arr as $value){ echo $value;
}

结果:中国 

所以foreach遍历数组的顺序是由元素的添加顺序决定的,不管是索引数组还是关联数组

2.
当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()怎么来理解这个呢?

$arr = array(1,2,3); foreach($arr as $k=>$v){

}
var_dump(current($arr)); foreach($arr as $key=>$value){ echo $value." ";
}
var_dump(current($arr));

结果:boolean false 1 2 3 boolean false 

第一个foreach已经把指针移到尾部去了,并且试图努力的往后移动指针,直到移出界(current($arr)返回false),foreach结束foreach结束后,并没有帮我们把指针初始化,不然current应该返回数组的第一个单元,第二个foreach并没有受第一个foreach的影响,当foreach开始执行时,数组内部的指针会自动指向第一个单元。

$key = currentKey($arrCopy); //将获取到的值分配给$k; $val = currentVal($arrCopy); //将获取到的值分配给$v; next($arrCopy);//移动副本数组的指针 $arr = $arrCopy;//将副本赋值回给$arr((主要是将指针同步移动))

技术细节:当本次赋值给key和val之后,按照流程指针已经向下移动了一位,所以当执行var_dump(current($arr));时打印false。如果移动指针的结果超出了数组单元的末端,则 next() 返回 FALSE。但foreach循环的次数不是副本数组的长度

二、加深foreach理解

$arr = array('a'=>1,'b'=>2,'c'=>3); foreach($arr as $k=>$v){
    $v*=2; echo $v."<br />";
}
var_dump($arr); foreach($arr as $key=>$value){
    $arr[$key]=$value*2;
}
var_dump($arr); //传入& foreach($arr as &$v){
    $v=$v*2;
}

var_dump($arr);
结果:

2
4
6  array (size=3)
  'a' => int 1
  'b' => int 2
  'c' => int 3  array (size=3)
  'a' => int 2
  'b' => int 4
  'c' => int 6  array (size=3)
  'a' => int 4
  'b' => int 8
  'c' => &int 12 

原因分析:
$k$v都是临时变量,foreach的时候,把每个数组单元的键分别赋值给$k,把每个数组单元的值分别赋给$v,相等于$v=$arr[$k],$v*2仅仅是改变了$v的值(非&传递),并不会影响到$arr[$k],自然也就不会影响到$arr
而用第二种方法(引用)的时候,相等于$v=&$arr[$k],$arr[$k]和$v指向同一内存地址,$v*2自然就改变了$arr[$k]的值,也就改变了$arr的值

我的微信:graent_hu

欢迎扫码加我和微信好友,有什么问题我们可以一起探讨,有什么需要也随时欢迎发消息给我~

转载请注明出处:

本文标题:PHP foreach原理详解

本文链接:https://www.wlyc.cn/post-146.html

分享到:

发表评论

路人甲 表情
看不清楚?点图切换