foreach循環時動態往數組裏添加數據
阿新 • • 發佈:2017-12-02
示例 一點 元素 ron 錯誤 一個 一起 你在 需要
今天在用TP做項目的時候遇到一個問題,foreach的時候需要動態往數組裏添加數據,示例代碼如下:
$arr = array( array(‘id‘=>‘字符串1‘,‘name‘=>‘字符串2‘,‘age‘=>‘字符串3‘), array(‘id‘=>‘字符串4‘,‘name‘=>‘字符串5‘,‘age‘=>‘字符串6‘), ); foreach ($arr as $v) { $v[‘sex‘] = ‘男‘; } var_dump($arr);
結果如下:
array(2) { [0]=> array(3) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" } [1]=> array(3) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" } }
我們能到看,sex並沒有添加成功,也沒有見到想象中的數據,比如:
array(2) { [0]=> array(4) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" ["sex"]=> string(3) "男" } [1]=> &array(4) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" ["sex"]=> string(3) "男" } }
這是為什麽?foreach循環的其實是數組的拷貝,而不是該數組本身,如果是數組拷貝的話,肯定是改變數組之前進行的拷貝,根據運行結果得知
雖然循環中確實改變了原有的數組,但循環的是拷貝的數組(也就是老的數組),所以你無法循環到新添加的元素。
說簡單一點就是你foreach裏的數組是值傳遞,並非引用傳遞,如果不清楚值傳遞和引用傳遞的話請自行百度了解一下。
這就導致了你在foreach裏打印的時候是添加成功了的,而在循環外使用的時候並沒有數據,示例代碼如下:
foreach ($arr as $v) { $v[‘sex‘] = ‘男‘; var_dump($v); }
//結果如下 array(4) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" ["sex"]=> string(3) "男" } array(4) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" ["sex"]=> string(3) "男" }
所以也很好解決,在變量前面加上&申明使用引用傳遞,而非值傳遞,這裏還需要註意一點只有命名變量才可以傳地址賦值。
foreach ($arr as &$v) { $v[‘sex‘] = ‘男‘; } var_dump($arr); //結果如下 array(2) { [0]=> array(4) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" ["sex"]=> string(3) "男" } [1]=> &array(4) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" ["sex"]=> string(3) "男" } }
這是我在日常工作中遇到的問題,這裏記錄下來
如果本文中有什麽錯誤,希望大家留言指出,一起相互學習,共同進步。
碼字不易,轉載請附上本文連接。
foreach循環時動態往數組裏添加數據