zoukankan      html  css  js  c++  java
  • php中foreach使用引用的陷阱

    有时候我们为了在循环过程中改变数组项的值,在foreach的时候变量入口可以加个&符合,

    表示,循环过程中使用数组中原来的值,而不是一个复制的值,如

    foreach ($array as &$item) {}
    

      

    这样一来,我们在循环中修改$item的值的时候,实际上修改的是$array中对应的值,

    而如果不加&符号的话,在循环中修改$item的值不会影响到$array。

    例子:

    $array = [
        'name' => 'Jobs',
        'age'  => 50,
    ];
    
    foreach ($array as $key => $value) {
        $value = 22;
    }
    print_r($array);
    
    foreach ($array as $key => &$value) {
        $value = 22;
    }
    print_r($array);
    

      

    Array
    (
        [name] => Jobs
        [age] => 50
    )
    Array
    (
        [name] => 22
        [age] => 22
    )

    陷阱:两次循环使用同样的临时变量的情况下,如果第一次循环使用的是引用,

    那么在第二次循环中即使没有加&符号,临时变量也是引用。

    这个引用指向了数组中最后一个元素(循环到了最后一个元素结束)。

    例子:

    $array = [
        'name' => 'php',
        'age' => 123,
    ];
    
    foreach ($array as $key => &$value) {
        echo "key=$key, value=$value" . PHP_EOL;
    }
    
    foreach ($array as $key => $value) {
        echo "key=$key, value=$value" . PHP_EOL;
    }
    

      

    key=name, value=php
    key=age, value=123
    key=name, value=php
    key=age, value=php
    

      

     上面最后一行的value是"php",并不是我们期望的123,这是因为,在第二个foreach循环中,

    每一次循环的时候,都修改了$array中的key为'age'的值,

    第一次循环的时候,数组中的age就已经是php(第一个值)了,在后续的循环中会依次改变数组中最后一个值,

    到最后一次循环的时候,取得的值是prev($array),也就是php了。

    如何避免这个问题?

    1、在第二次循环之前,unset($value)

    2、第二次foreach的时候使用不同名字的变量,如$item

    另:查看一个变量是否是引用可以使用xdebug_debug_zval函数(需要有xdebug扩展)。

    xdebug_debug_zval的结果形如:

    value: (refcount=2, is_ref=1)=123

  • 相关阅读:
    模式识别之svm()---支持向量机svm 简介1995
    机器视觉之相关资源--- 计算机视觉相关的部分测试数据集和源码站点
    包的引入,不要引入自己目录下的。
    内省对象 用的少,被BeanUtils代替
    使用增强for循环遍历集合的时候操作集合的问题?
    Integer 内部实现
    eclipse常用快捷键
    java 运行时环境和编译器环境
    js 随机变换图片
    js 事件点击 显示 隐藏
  • 原文地址:https://www.cnblogs.com/eleven24/p/7422170.html
Copyright © 2011-2022 走看看