2013-11-21 4 views
0

У меня есть код, проходящий через массив, и если его элемент имеет число больше 1, копирует этот элемент на столько элементов, сколько qty, а затем устанавливает 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 в исходных элементов массива отвечает критерии qty> 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 остается 1 для всех из них, даже после того, как внутренняя foreach петля работать. Это подталкивает меня к стене, потому что я не новичок и раньше делал это. Просто не могу для жизни меня выяснить, что я делаю неправильно здесь.

ответ

1

Я хотел бы сделать это как Leonardo шоу, но альтернативный:

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

Чтобы изменить массив непосредственно в цикле Еогеасп вы должны использовать «&», как это:

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

Смотрите docs

Смежные вопросы