PHP foreach的兩種用法____PHP

來源:互聯網
上載者:User

前言:

        php4中引入了foreach結構,這是一種遍曆數組的簡單方式。相比傳統的for迴圈,foreach能夠更加便捷的擷取索引值對。在php5之前,foreach僅能用於數組;php5之後,利用foreach還能遍曆對象。本文中僅討論遍曆數組的情況。


第一種格式遍曆給定的 array_expression 數組。


         每次迴圈中,當前單元的值被賦給 $value 並且數組內部的指標向前移一步(因此下一次迴圈中將會得到下一個單元)。

第二種格式做同樣的事,只是除了當前單元的值以外,索引值也會在每次迴圈中被賦給變數 $key。看下面代碼:


索引值這裡可以理解為數組下標,數組元素a[2]的下標就是2.

        當 foreach 開始執行時,數組內部的指標會自動指向第一個單元。這意味著不需要在 foreach 迴圈之前調用 reset()。而while迴圈需要reset。下面兩種代碼功能完全相同。

1.用while迴圈


2.用foreach


         此外注意 foreach 所操作的是指定數組的一個拷貝,而不是該數組本身。因此即使有 each() 的構造,原數組指標也沒有變,數組單元的值也不受影響。

        foreach 不支援用“@”來禁止錯誤資訊的能力。

      foreach雖然簡單,不過它可能會出現一些意外的行為,特別是代碼涉及引用的情況下。
      問題:
複製代碼代碼如下:
$arr = array(1,2,3);
foreach($arr as $k => &$v) {
    $v = $v * 2;
}
// now $arr is array(2, 4, 6)
foreach($arr as $k => $v) {
    echo "$k", " => ", "$v";
}

        先從簡單的開始,如果我們嘗試運行上述代碼,就會發現最後輸出為0=>2  1=>4  2=>4 。
        為何不是0=>2  1=>4  2=>6 。
        其實,我們可以認為 foreach($arr as $k => $v) 結構隱含了如下操作,分別將數組當前的'鍵'和當前的'值'賦給變數$k和$v。具體展開形如:
複製代碼代碼如下:
foreach($arr as $k => $v){ 
    //在使用者代碼執行之前隱含了2個賦值操作
    $v = currentVal(); 
    $k = currentKey();
    //繼續運行使用者代碼
    ……
}

根據上述理論,現在我們重新來分析下第一個foreach:
第1遍迴圈,由於$v是一個引用,因此$v = &$arr[0],$v=$v*2相當於$arr[0]*2,因此$arr變成2,2,3
第2遍迴圈,$v = &$arr[1],$arr變成2,4,3
第3遍迴圈,$v = &$arr[2],$arr變成2,4,6
隨後代碼進入了第二個foreach:
第1遍迴圈,隱含操作$v=$arr[0]被觸發,由於此時$v仍然是$arr[2]的引用,即相當於$arr[2]=$arr[0],$arr變成2,4,2
第2遍迴圈,$v=$arr[1],即$arr[2]=$arr[1],$arr變成2,4,4
第3遍迴圈,$v=$arr[2],即$arr[2]=$arr[2],$arr變成2,4,4
OK,分析完畢。
如何解決類似問題呢。php手冊上有一段提醒:
Warning : 數組最後一個元素的 $value 引用在 foreach 迴圈之後仍會保留。建議使用unset()來將其銷毀。
複製代碼代碼如下:
$arr = array(1,2,3);
foreach($arr as $k => &$v) {
    $v = $v * 2;
}
unset($v);
foreach($arr as $k => $v) {
    echo "$k", " => ", "$v";
}
// 輸出 0=>2  1=>4  2=>6

        從這個問題中我們可以看出,引用很有可能會伴隨副作用。如果不希望無意識的修改導致數組內容變更,最好及時unset掉這些引用。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.