2013-11-21 164 views
0

我有一些代碼循環遍歷一個數組,如果它的一個元素的數量大於1,則將該元素拷貝到與qty一樣多的元素中,然後設置數量所有他們到1(並做了一些其他的變化)。無法修改數組元素的值

我一直盯着這個很長一段時間,我敢肯定我必須失去一些明顯的東西,因爲我不能爲了我得到它來改變我想改變的價值。

這裏的基本代碼:

foreach ($items as $id => $itm) { 
    // if there's an item that has a qty > 1, need to split out into multiple nodes with qty = 1 
    if ($itm['qty'] > 1) { 
     $qtyCount = $itm['qty']; 
     $newItems = array_fill($id, $qtyCount, $itm); 

     foreach ($newItems as $newId => $n) { 
      $n['qty'] = 1; 
      $n['deal_id'] = $newId; 
     } 

     error_log("new items"); 
     error_log(print_r($newItems,1)); 
    } 
} 

我會開始是一個數組,看起來像這樣:

[items] => Array 
    (
     [0] => Array 
      (
       [product] => AW8B 
       [qty] => 1 
       [subtotal] => 6.500 
       [deal_id] => 
      ) 

     [1] => Array 
      (
       [product] => C 
       [qty] => 3 
       [subtotal] => 30.000 
       [deal_id] => 1 
      ) 

     [2] => Array 
      (
       [product] => QUEPAP 
       [qty] => 1 
       [subtotal] => 4.000 
       [deal_id] => 
      ) 

    ) 

在這種情況下,只有在原有的項目元素1陣列滿足數量> 1的標準,所以代碼應該創建一個新的數組,其中包含三個相同的元素開始。然後foreach($newItems as $newId => $n)循環應循環遍歷新的3元素數組,並將每個元素的qty元素設置爲1,並將deal_id元素設置爲循環索引。我期望error_log(print_r($newItems,1))行返回的內容如下所示。

[newItems] => Array 
(
    [1] => Array 
     (
      [product] => C 
      [qty] => 1 
      [subtotal] => 30.000 
      [deal_id] => 1 
     ) 

    [2] => Array 
     (
      [product] => C 
      [qty] => 1 
      [subtotal] => 30.000 
      [deal_id] => 2 
     ) 

    [3] => Array 
     (
      [product] => C 
      [qty] => 1 
      [subtotal] => 30.000 
      [deal_id] => 3 
     ) 
) 

然而,數量仍然是3和DEAL_ID甚至內部foreach循環運行後保持1爲所有這些。這讓我感動不已,因爲我不是新手,而且之前也做過這種事情。只是不能爲我的生活弄清楚我在這裏做錯了什麼。

回答

1

我會做它作爲Leonardo節目,還有一個備用:

foreach ($newItems as $newId => $n) { 
    $newItems[$newId]['qty'] = 1; 
    $newItems[$newId]['deal_id'] = $newId; 
} 
1

直接修改的數組在foreach循環中,您必須使用「&」,像這樣:

foreach ($newItems as $newId => &$n) { 
    .... 
} 

docs