1. 程式人生 > >foreach循環時動態往數組裏添加數據

foreach循環時動態往數組裏添加數據

示例 一點 元素 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循環時動態往數組裏添加數據