美文网首页
PHP中foreach引用的坑

PHP中foreach引用的坑

作者: 唐西铭 | 来源:发表于2017-11-24 14:30 被阅读0次

    背景

    已知一个map如下:

    $array = array(
      "key1" => 1,
      "key2" => 2,
      "key3" => 3
    )
    

    想要做的操作:

    • 修改map中每个value的值
    • 将map中的所有value放入一个数组中返回

    实现方式

    方案

    主要通过foreach&(引用)实现,如下:

    // step1
    foreach($array as $key => &$value) {
      $value += 1;
    }
    
    // step2
    $result = array();
    foreach($array as $key => $value) {
      array_push($result, $value);
    }
    print_r($result);
    

    如果不用&(引用),无法修改数组的值。

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

    结果

    $result = array(2, 3, 3)
    

    分析

    当使用&(引用)后,$value值的修改会同时修改原数组中的值,在step1过后,$value始终指向数组最后一个元素,在step2遍历过程中,一直在修改数组最后一个元素的值。过程如下:

    image.png
    解决方案:
    • 在step1后,unset($value),移除$value的指向
    • 在step2中遍历时,同样使用&引用

    结论

    • foreach遍历时,使用的是数组的副本;若加上&引用,访问的才是原始数组;
    • 在foreach中使用的变量,在之后的代码中并不会自动释放;

    相关文章

      网友评论

          本文标题:PHP中foreach引用的坑

          本文链接:https://www.haomeiwen.com/subject/sgoxbxtx.html