1.foreach的遍歷順序
若是是索引數組,你會發現遍歷出來的順序並非按索引大小遍歷,而是按添加的順序
,若是按照索引大小遍歷,應該使用for
,而不是foreach
php
$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循環的次數不是副本數組的長度
函數
$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