PHP引用数组而不是复制

时间:2013-11-22 11:48:37

标签: php arrays

我有一个数组,我需要复制数组中的第一项并改变它。

这就是我正在做的事情:

echo $QuantityDiscounts[0]['price'] . '<br>';
echo $QuantityDiscounts[0]['from_quantity'] . '<br>';

$firstItem                  = $QuantityDiscounts[0];
$firstItem['from_quantity'] = 999;
$firstItem['price']         = 999;

echo $QuantityDiscounts[0]['price'] . '<br>';
echo $QuantityDiscounts[0]['from_quantity'] . '<br>';

这是我给出的输出:

4.870000
10
4.870000
999

当我更改复制数组的值时,它正在更改原始数组。是什么让这个更奇怪的是它只发生在'from_quantity'项目中。正如您所看到的,“价格”元素保持不变。

我无法弄清楚为什么会发生这种情况,因为你可以看到我没有使用引用。对于我缺少的这种行为有没有解释?

更多信息:

如果我首先复制原始数组中的'from_quantity',以便它使用不同的键,则此行为就会消失。

$QuantityDiscounts[0]['test'] = $QuantityDiscounts[0]['from_quantity'];

echo $QuantityDiscounts[0]['price'] . '<br>';
echo $QuantityDiscounts[0]['from_quantity'] . '<br>';
echo $QuantityDiscounts[0]['test'] . '<br>';

$firstItem = $QuantityDiscounts[0];
$firstItem['from_quantity'] = 999;
$firstItem['test']          = 999;
$firstItem['price']         = 999;

echo $QuantityDiscounts[0]['price'] . '<br>';
echo $QuantityDiscounts[0]['from_quantity'] . '<br>';
echo $QuantityDiscounts[0]['test'] . '<br>';

输出:

4.870000
10
10
4.870000
999
10

**更新** - 感谢您的帮助到目前为止

这是生成数组的函数。我可以看到在那里使用的引用必须引起问题。这是否意味着我无法在不更改原始内容的情况下复制和修改“from_quantity”?

protected function formatQuantityDiscounts($specific_prices, $price, $tax_rate, $ecotax_amount)
{
    foreach ($specific_prices as $key => &$row)
    {
        $row['quantity'] = &$row['from_quantity'];
        if ($row['price'] >= 0) // The price may be directly set
        {
            $cur_price = (Product::$_taxCalculationMethod == PS_TAX_EXC ? $row['price'] : $row['price'] * (1 + $tax_rate / 100)) + (float)$ecotax_amount;
            if ($row['reduction_type'] == 'amount')
                $cur_price -= (Product::$_taxCalculationMethod == PS_TAX_INC ? $row['reduction'] : $row['reduction'] / (1 + $tax_rate / 100));
            else
                $cur_price *= 1 - $row['reduction'];
            $row['real_value'] = $price - $cur_price;
        }
        else
        {
            if ($row['reduction_type'] == 'amount')
                $row['real_value'] = Product::$_taxCalculationMethod == PS_TAX_INC ? $row['reduction'] : $row['reduction'] / (1 + $tax_rate / 100);
            else
                $row['real_value'] = $row['reduction'] * 100;
        }
        $row['nextQuantity'] = (isset($specific_prices[$key + 1]) ? (int)$specific_prices[$key + 1]['from_quantity'] : -1);
    }
    return $specific_prices;
}

2 个答案:

答案 0 :(得分:1)

如果$QuantityDiscounts[0]['from_quantity']已经 IS 引用,则无需再次引用它 - 它将保留引用,并且引用将在赋值时复制,而不是实际值

此代码演示了我的意思:

$foo = 10;

$QuantityDiscounts[0]['price'] = 4.870000;
$QuantityDiscounts[0]['from_quantity'] =& $foo;
$firstItem                  = $QuantityDiscounts[0];
$firstItem['from_quantity'] = 999;
$firstItem['price']         = 999;

echo $QuantityDiscounts[0]['price'] . '<br>';
echo $QuantityDiscounts[0]['from_quantity'] . '<br>';

输出:

4.87
999    (instead of the initial value 10 !)

要获得数组(及其所有元素)的真实 COPY ,您需要手动取消引用子元素。不幸的是,PHP还没有内置的方法。

有关如何在复制时取消引用数组元素的信息,请参阅this QA on StackOverflow

答案 1 :(得分:0)

问题最可能的原因是您的变量指向一个对象,而不是一个数组。通过ArrayAccess接口将对象作为数组进行访问非常简单,并且因为它指向一个对象(并且对象总是作为引用传递),所以值会更改。在进行任何更改之前Clone变量。

另一个可能的原因是你明确使用引用。在这种情况下,您必须找到问题所在,并自行修复,因为我们无法访问您的应用程序。