2013-11-22 48 views
1

我有一個數組,我需要複製數組中的第一個項目並對其進行修改。PHP引用數組而不是複製

這是我在做什麼:

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

我只是做了一個phpfiddle並嘗試它,它不是引用我 - http:// phpfiddle。org/main/code/b8g-03e你一定在做別的事情。 –

+1

哪個版本的php?請提供一個完整的代碼,我們可以複製/粘貼到測試 – Asenar

+0

OP可能是這樣做的: http://phpfiddle.org/main/code/naj-0gu – Kaii

回答

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

+0

這可能是不相關的,但我記得不得不在C#中使用'AddRange',因爲複製一個列表會使原來的內容被修改。也許在PHP中有類似的功能。 – 2013-11-22 12:15:54

+0

謝謝,這正是我的問題。我沒有意識到數組已經包含了一個引用,並且即使在複製數組後,引用仍然會保留。 – jd182

0

問題最可能的原因是你的變量指向一個對象而不是數組。通過接口將對象作爲數組訪問非常簡單,並且因爲它指向一個對象(並且對象始終作爲引用傳遞),所以該值會更改。 Clone進行任何更改之前的變量。

另一個可能的原因是你明確使用引用。在這種情況下,您必須找出問題所在並自行解決,因爲我們無法訪問您的應用程序。

相關問題