zoukankan      html  css  js  c++  java
  • 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) "男"
      }
    }

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

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

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

  • 相关阅读:
    logback 范例
    mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    MySQL中视图和普通表的区别
    Linux 下升级JDK 1.7到1.8
    本人遇到的spring事务之UnexpectedRollbackException异常解决笔记
    Spring 调度任务@scheduled学习总结
    javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
    spring中的scope详解
    Spring Boot 静态资源处理
    用人所长
  • 原文地址:https://www.cnblogs.com/blibli/p/7944678.html
Copyright © 2011-2022 走看看