PHP foreach的兩種用法 as $key => $value

來源:互聯網
上載者:User
這篇文章介紹的內容是關於PHP foreach的兩種用法 as $key => $value,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

一 foreach的文法介紹

PHP 4以上的版本包括了 foreach 結構,這隻是一種遍曆數組簡便方法。foreach 僅能用於數組,當試圖將其用於其它資料類型或者一個未初始化的變數時會產生錯誤。有兩種文法,第二種是第一種的有用的擴充。


1

2


foreach(array_expression as $value) statementforeach(array_expression as $key => $value) statement


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

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


1

2

3

4

5

6

7

8

9


$arr = array("1"=>"111","2"=>"222","3"=>"333");foreach($arr as $key=>$value){echo $key."=>".$value."\n";}結果如下:1=>1112=>2223=>333


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


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

1.用while迴圈


1

2

3

4

5


$arr = array("one", "two", "three");reset ($arr);while (list(, $value) = each ($arr)) {echo "Value: $value<br>\n";}


2.用foreach


1

2

3


foreach ($arr as $value) {echo "Value: $value<br>\n";}


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

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

二 PHP foreach 小結

1.foreach 中使用引用的情況。



普通情況下,foreach($arr as $value)中的$arr和$value是拷貝,不受外部影響的,即


1

2

3

4

5

6

7

8

9


$arr = array(0,1,2,3,4,5);foreach($arr as $value){$arr = array();echo $value;}



結果是:12345

但如果$arr是引用的話,情況則不同了,我們用代碼來說明問題


1

2

3

4

5

6

7

8

9

10

11


$arr = array(0,1,2,3,4,5);$arr = &$arr;foreach($arr as $value){$arr = array();echo $value;}


結果是: 0

這是因為迴圈用的$arr是直接指向原資料的,而不是copy了一份。

如果$value是引用,而$arr不是引用,其結果是一樣的,同樣$value是指向原資料的而不是copy


1

2

3

4

5

6

7

8

9


$arr = array(0,1,2,3,4,5);foreach($arr as &$value){$arr = array();echo $value;}


結果是: 0

還有一種情況比較特殊,即是如果定義了$arr為全域變數的話,$arr也會變成引用


1

2

3

4

5

6

7

8

9

10

11


global $arr;$arr = array(0,1,2,3,4,5);foreach($arr as $value){$arr = array();echo $value;}


結果是: 0

2. 如果兩次迴圈一個數組,一定不能這樣寫


1

2

3


foreach($arr as &$value){}foreach($arr as $value){}


這會導致第二次的迴圈的結果不正確(可能是php的bug吧)。可以用以下幾種來代替:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


//solution 1foreach($arr as &$value){}unset($value);foreach($arr as $value){}//solution 2foreach($arr as &$value){}foreach($arr as &$value){}//solution 3foreach($arr as &$value){}$arr2 = $arr;foreach($arr2 as $value){}


相關推薦:

詳解PHP中foreach的用法和執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.