【问题标题】:PHP dereference array elementsPHP 取消引用数组元素
【发布时间】:2011-01-22 12:59:02
【问题描述】:

我有 2 个数组。

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

Row 的元素都是引用并且是不断变化的。对于$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);

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

【问题讨论】:

标签: php arrays reference dereference


【解决方案1】:

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

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】:

像下面这样扩展上面的函数解决了我遇到的一个问题:

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;
}

【讨论】:

    【解决方案3】:
    $result = array_map(function($_){return $_;}, $row);
    

    【讨论】:

    • 您好 DonJaime,欢迎来到 StackOverflow。 :-) 你似乎在这里发布了一个很好的答案。然而,不要仅仅发布代码作为答案,请在您的解决方案中添加说明,以便读者也可以理解它的工作原理。
    • 这与$result = $row有何不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2014-01-11
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多