PHP foreach原理詳解

1、foreach簡介

1.foreach的遍歷順序
若是是索引數組,你會發現遍歷出來的順序並非按索引大小遍歷,而是按添加的順序,若是按照索引大小遍歷,應該使用for,而不是foreachphp

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

結果:中國

因此foreach遍歷數組的順序是由元素的添加順序決定的,無論是索引數組仍是關聯數組html

2.
當 foreach 開始執行時,數組內部的指針會自動指向第一個單元。這意味着不須要在 foreach 循環以前調用 reset()怎麼來理解這個呢?segmentfault

$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循環的次數不是副本數組的長度函數

2、加深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的值code

PHP current() 函數語法
參考文檔:深刻探討php的foreach
參考文檔:當咱們使用foreach時,內部究竟發生了什麼(PHP5)?htm

相關文章
相關標籤/搜索