• foreach循环时动态往数组里添加数据


    今天在用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) "男"
      }
    }

    这是我在日常工作中遇到的问题,这里记录下来

    如果本文中有什么错误,希望大家留言指出,一起相互学习,共同进步。

    码字不易,转载请附上本文连接。

  • 相关阅读:
    CaltrainTimes从设计到发布(基于Flex的手机应用)
    使用Flex构建Web和移动参考应用程序
    使用Flex4容器若干技巧
    移动设备外观设计的基础知识
    在移动设备应用程序中使用文本的指导原则
    在移动设备应用程序中使用软键盘
    多分辨率适配(下)
    多分辨率适配(上)
    CocosBuilder 多分辨率基础
    【2019-12-31】在逆境中锻炼自己的心态
  • 原文地址:https://www.cnblogs.com/blibli/p/7944678.html
Copyright © 2020-2023  润新知