doufeng9567 2013-09-16 20:38
浏览 34
已采纳

使用引用复制数组; 如何只获取值

I was messing with arrays and references, when I came across an interesting problem. Take this code, for example:

// Set everything up
$testArray = array(
    'a' => array(),
    'b' => array()
);

$saved = array();

$ref =& $testArray['b'];

// Set a value via the reference
$ref = array(1);

// Save the current array state
$saved[] = $testArray; // This shouldn't be a reference, right?

// Set another value via the reference
$ref = array(2);

// Save the current array state
$saved[] = $testArray; // This shouldn't be a reference, right?

Nothing too complicated. It makes an array, and a reference to a "deep value" in the array.

When I var_dump($saved), the result is not what I expect! I get:

array(2) {
  [0]=>
  array(2) {
    ["a"]=>
    array(0) {
    }
    ["b"]=>
    &array(1) {
      [0]=>
      int(2)
    }
  }
  [1]=>
  array(2) {
    ["a"]=>
    array(0) {
    }
    ["b"]=>
    &array(1) {
      [0]=>
      int(2)
    }
  }
}

I thought arrays were copied by value, not reference. Why is [b] equal to array(2) in both spots? How can I copy an array and break its references?

I want the result to be:

array(2) {
  [0]=>
  array(2) {
    ["a"]=>
    array(0) {
    }
    ["b"]=>
    array(1) {
      [0]=>
      int(1)
    }
  }
  [1]=>
  array(2) {
    ["a"]=>
    array(0) {
    }
    ["b"]=>
    array(1) {
      [0]=>
      int(2)
    }
  }
}

Why is $ref still linked to a copy of the $testArray array? I want to basically save the "state" of the array, and have the reference only update the original and not the copy.

  • 写回答

2条回答 默认 最新

  • dougou1127 2013-09-16 21:21
    关注

    Your array contains arrays' references, if you copy your array, the sub-arrays are just references... you need a deep copy. Make a recursive function:

    function cloneArray($array){
        $newArray = array();
    
        foreach($array as $key => $value){
            if(is_array($value))
                $value = cloneArray($value);
    
            $newArray[$key] = $value;
        }
    
        return $newArray;
    }
    

    this should work for your needs

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 找人不需要人工智能回答的gamit解算后做形变分析
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥15 统计大规模图中的完全子图问题
  • ¥15 使用LM2596制作降压电路,一个能运行,一个不能
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错