php中foreach與引用的乙個問題。。

2021-06-22 10:37:50 字數 1011 閱讀 7683

<?php

$ar=

array(1

,2,3

);var_dump

($ar);

foreach

($aras&

$v)foreach

($ar

as$v

)var_dump

($ar);

?>

array(3)

array(3)

在執行第乙個使用引用的 foreach 時, 一開始, $v 指向 $ar[0] 的儲存空間,空間內儲存著 1 , foreach 結束時, $v 指向 $ar[2] 的儲存空間,空間內儲存著 3 。 下面要開始執行第二個 foreach 了,注意和第乙個 foreach 不同, 第二個 foreach 沒有使用引用,那麼就是賦值方式, 即將 $ar 的值依次賦值給 $v 。 進行到第乙個元素時,要將 $ar[0] 賦值給 $v 。 問題就在這裡,由於剛剛執行完第乙個 foreach, $v 不是乙個新變數,而是已經存在的、指向 $ar[2] 的那個 引用 , 如此一來,對 $v 進行賦值的時候,就將 $ar[0] = 1 寫入了 $ar[2] 的實際儲存空間, 相當於對 $ar[2] 進行賦值。 依此類推,第二個 foreach 執行的結果, 就是陣列的最後乙個元素變成了倒數第二個元素的值。

如果說這是乙個錯誤,那麼錯誤的原因就在於對引用變數的使用。 當引用變數指向和其他變數時,改變引用變數的值當然會影響到他指向的其他變數。 單獨說誰都明白,但在這個 foreach 例子中,湊巧了, 同乙個變數兩次被使用,前一次是引用的身份,後一次是普通變數身份, 就產生了意料之外的效果。 php 的開發者也認為,這種情況屬於語言特性造成的,不是 bug。 的確,如果要修復這個問題,一種方法是對 foreach 進行特殊處理之外, 另外一種就是限制 foreach 中 $v 的作用域, 這兩種方式都與目前 php 的語言特性不符,開發人員不願改, 但還是在 官方文件 中用 warning 進行了說明。

php中for與foreach對比

總體來說,如果資料庫過幾十萬了,才能看出來快一點還是慢一點,如果低於10萬的迴圈,就不用測試了。php推薦用foreach。迴圈數字陣列時,for需要事先count arr 計算陣列長度,需要引入自增變數 i,每次迴圈都要進行條件判斷 i c,然後自增 i 輸出陣列元素時,arr i 需要進行雜湊操...

foreach中引用 的問題

在工作中遇到 關於 php foreach 引用的乙個問題 簡單來說,如下 arr array a b c d foreach arr as k v foreach arr as k v print r arr 結果是 ab cc參考了 這篇文章,以及 這篇文章 在第一次foreach 遍歷結束後,...

PHP之foreach引用填坑

看到一篇文章描 就是它 述了php的乙個語法特點,用文本來描述就是如果對乙個陣列進行foreach引用遍歷過後在對這個陣列使用同樣的變數進行一次普通foreach遍歷會導致這個陣列的值發生變化。我這個描述可能還是不太清楚,直接上 可以看到在迴圈當中沒有任何 所以兩次列印出來的資料肯定應該是一模一樣的...