我有一个数组,我需要复制数组中的第一项并改变它。
这就是我正在做的事情:
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;
}
答案 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
变量。
另一个可能的原因是你明确使用引用。在这种情况下,您必须找到问题所在,并自行修复,因为我们无法访问您的应用程序。