foreach迴圈時動態往數組裡添加數據,有一次做項目中,foreach的時候需要動態往數組裡添加數據(我們這裡隨便舉個例子) 結果: 哎?奇了怪了,這說明foreach迴圈時可以動態的往數組裡添加數據,為什麼$arr的數據確實被添加上了,但是沒有被foreach迴圈出來呢?網上查找得知,forea
foreach迴圈時動態往數組裡添加數據,有一次做項目中,foreach的時候需要動態往數組裡添加數據(我們這裡隨便舉個例子)
結果:
哎?奇了怪了,這說明foreach迴圈時可以動態的往數組裡添加數據,為什麼$arr的數據確實被添加上了,但是沒有被foreach迴圈出來呢?
網上查找得知,foreach迴圈的其實是數組的拷貝,而不是該數組本身,如果是數組拷貝的話,肯定是改變數組之前進行的拷貝,根據運行結果得知
雖然迴圈中確實改變了原有的數組,但迴圈的是拷貝的數組(也就是老的數組),所以你無法迴圈到新添加的元素
好吧,暫且忍了
如果foreach的時候用引用賦值,新添加的數據就可以被迴圈出來了
結果:
而foreach($arr as &$v){···}的時候,此方法將以引用賦值而不是拷貝一個值,$v和$arr[$k]指向同一記憶體地址,此時foreach迴圈的是原數組, 數組的指針也是在原數組中移動的,所以新添加的數據可以被迴圈出來,值的變化也直接影響數組本身的值
那既然&的時候,foreach直接迴圈的是原數組,那我這樣呢?
結果:
既然&的時候,直接操作的是原數組,為什麼unset($v)之後,原數組不變呢?
foreach($arr as &$v){···}的時候,相等於$v=&$arr[$k]
$arr[$k]和$v同時指向$arr[$k]的記憶體地址,即便是unset($v),僅僅是刪除了$v對記憶體空間的引用,並沒有刪除$arr[$k]對記憶體地址的引用,所以$arr[$k]依然健在,$arr自然也就沒變化,所以應該這樣
結果:
還有一點需要註意:&$k什麼結果
結果:
意思是:鍵不能被引用,壓根就沒有這種語法格式