深入解析php中的foreach問題

2021-09-01 14:36:17 字數 1267 閱讀 9891

本篇文章是對php中的foreach問題進行了詳細的分析介紹,需要的朋友參考下

前言:

php4中引入了foreach結構,這是一種遍歷陣列的簡單方式。相比傳統的for迴圈,foreach能夠更加便捷的獲取鍵值對。在php5之前,foreach僅能用於陣列;php5之後,利用foreach還能遍歷物件(詳見:遍歷物件)。本文中僅討論遍歷陣列的情況。

foreach雖然簡單,不過它可能會出現一些意外的行為,特別是**涉及引用的情況下。

下面列舉了幾種case,有助於我們進一步認清foreach的本質。

問題1:

複製**

**如下:

$arr = array(1,2,3);

foreach($arr as $k => &$v)

// now $arr is array(2, 4, 6)

foreach($arr as $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)

根據上述理論,現在我們重新來分析下第乙個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:

warning : 陣列最後乙個元素的 $value 引用在 foreach 迴圈之後仍會保留。建議使用unset()來將其銷毀。

複製**

**如下:

$arr = array(1,2,3);

foreach($arr as $k => &$v)

unset($v);

foreach($arr as $k => $v)

// 輸出 0=>2  1=>4  2=>6

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

深入解析php中的foreach函式

foreach 函式 php4 php5 foreach語法結構提供了遍歷陣列的簡單方式。foreach僅能夠應用於陣列和物件,如果嘗試應用於其他資料型別的變數,或者未初始化的變數將發出錯誤資訊。有兩種語法 複製 如下 foreach array expr程式設計客棧ession as value ...

PHP的MVC框架 深入解析

原文 php的mvc框架 深入解析 本篇先介紹一下php的mvc實現原理,我們框架的mvc部分也是基於此原理實現的,但是今天的 並不是框架內的 僅僅為說明原理 一 檔案結構 建立3個資料夾 controller資料夾存放控制器檔案 view資料夾存放視 件 model資料夾存放資料檔案 建立1個in...

PHP的MVC框架 深入解析

本篇先介紹一下php的mvc實現原理,我們框架的mvc部分也是基於此原理實現的,但是今天的 並不是框架內的 僅僅為說明原理 建立3個資料夾 我們在controller資料夾下建立乙個democontroller.php檔案,檔案內容如下 class democontroller end of fil...