• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

说说PHP中foreach引用的一个坑

php 搞代码 3年前 (2022-01-23) 15次浏览 已收录 0个评论

先来看看下面这段代码:

<?php     $arr = array('apple','banana','cat','dog');    foreach($arr as $key=>$val)    {  <div>……本2文来源gaodai.ma#com搞##代!^码@网3</div><code>搞代gaodaima码</code>      //some code    }    echo $val;  //输出dog    echo $key;  //输出3    //下面对val进行赋值    $val = 'e';    print_r($arr);  //输出Array ( [0] => apple [1] => banana [2] => cat [3] => dog )

说明:在上面的foreach循环中,当循环结束后,$key和$val变量都不会被自动释放掉。值会被保存下来。而且此时修改$val的值不会影响$arr。

引用:如果想在遍历数组的过程中修改数组的元素,可以在foreach中对$val使用引用。此时被引用的元素$val指向当前数组元素的内存地址,即共享一段内存地址。因此修改$val的值会同时改变$arr[$key]的值。

再来看看下面一段在foreach中使用引用的代码,这是最近在项目中遇到的一种情况:

<?php     $arr = array('apple','banana','cat','dog');    //在foreach中使用引用    foreach($arr as $key => &$val)    {        $val = 'new value';    }    echo $val;  //输出new value    echo $key;  //输出3    $val = 'egg';    print_r($arr);  //输出Array ( [0] => new value [1] => new value [2] => new value [3] => egg )

说明:在foreach中使用&引用后,当foreach结束后,$key和$val变量也都不会被自动释放掉,但是此时$val和$arrcount($arr) – 1指向相同的内存地址。因此,此时修改$val的值也会改变了$arr[3]的值。

这种情况下很容易犯的错误就是像上面例子所示,在循环外面继续使用被foreach引用的变量,这样会使开发者得不到预期的数据。因此,为了避免这种情况的发生,应该在适当的位置释放变量的引用。以上面的代码为例:

<?php     $arr = array('apple','banana','cat','dog');    //在foreach中使用引用    foreach($arr as $key => &$val)    {        $val = 'new value';    }    unset($val);    echo $val;  //报错,Notice: Undefined variable: val    echo $key;  //输出3    $val = 'egg';     print_r($arr);  //输出Array ( [0] => new value [1] => new value [2] => new value [3] => new value ) 在foreach结束后unset $val,此时会释放对$val的引用。因此改变$val不会对$arr造成影响。

这是最近在项目中遇到的坑和解决方案的总结,如果错误或更好地建议,欢迎指出。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:说说PHP中foreach引用的一个坑
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址