• 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

  • 相关阅读:
    C# 连接 Oracle 的几种方式
    Mac电脑卸载软件后删除残余图标
    文件监视器数量达到系统限制
    Android实现伸缩弹力分布菜单效果
    XMPP协议实现原理介绍
    Android开发之日历控件实现
    OpenGL开发之旅基础知识介绍
    Android in Mono开发初体验之DataBase
    JAVA实现随机无重复数字功能
    Android实现宫格图片连续滑动效果
  • 原文地址:https://www.cnblogs.com/eleven24/p/7422170.html
Copyright © 2020-2023  润新知