代码之家  ›  专栏  ›  技术社区  ›  anomareh

PHP取消引用数组元素

  •  6
  • anomareh  · 技术社区  · 15 年前

    我有两个阵列。

    $result = array();
    $row = array();
    

    行的元素都是引用,并且不断变化。对于每个迭代 $row 我想复制 价值观 进入 $result 而不是参考文献。

    我找到了一些解决方案,但它们看起来都相当糟糕。

    $result[] = unserialize(serialize($row));
    $result[] = array_flip(array_flip($row));
    

    以上两种方法都有效,但似乎只是为了按值复制引用数组的内容,而不是复制引用本身,就有很多不必要和丑陋的代码。

    有没有一个更清洁的方法来完成这一点?如果不是,最有效的方法是什么?

    谢谢。

    编辑: 如下建议:

    function dereference($ref) {
        $dref = array();
    
        foreach ($ref as $key => $value) {
            $dref[$key] = $value;
        }
    
        return $dref;
    }
    
    $result[] = dereference($row);
    

    同样有效,但看起来同样丑陋。

    2 回复  |  直到 13 年前
        1
  •  4
  •   Ross Snyder    15 年前

    不确定我完全理解这个问题,但是你能使用递归吗?

    function array_copy($source) {
        $arr = array();
    
        foreach ($source as $element) {
            if (is_array($element)) {
                $arr[] = array_copy($element);
            } else {
                $arr[] = $element;
            }
        }
    
        return $arr;
    }
    
    $result = array();
    $row = array(
        array('a', 'b', 'c'),
        array('d', 'e', 'f')
    );
    
    $result[] = array_copy($row);
    
    $row[0][1] = 'x';
    
    var_dump($result);
    var_dump($row);
    
        2
  •  2
  •   Oliver    13 年前

    把上面的函数扩展如下,解决了我遇到的一个问题:

    function array_copy($source) {
        $arr = array();
    
        foreach ($source as $element) {
            if (is_array($element)) {
                $arr[] = array_copy($element);
            } elseif (is_object($element)) {
                // make an object copy
                $arr[] = clone $element;
            } else {
                $arr[] = $element;
            }
        }
        return $arr;
    }