2009-12-07 46 views
0

我有以下的問題,我有名字的數組$數據陣列中的

在這陣我有類似

[6] => Array 
     (
      [code] => 642 
      [total] => 1708 
     ) 

    [7] => Array 
     (
      [code] => 642 
      [total] => 53 
     ) 

    [8] => Array 
     (
      [code] => 642 
      [total] => 1421 
     ) 

在某些元素的代碼計數的消除重複的關聯值值是相同的,現在我想要做的是將所有具有相同代碼值的元素合併在一起,然後將總計加在一起。我試圖在foreach循環中執行此操作,但似乎不起作用。

我做這樣的事情

$old_lc = null; 
     $old_lcv = 0; 
     $count = 0; 
     $dd = null; 


     foreach($data as $d){ 

      if($d['code'] == $old_lc){ 
       $d['total'] = $d['total'] + $old_lcv; 
       $count--; 
       $dd[$count]['code'] = $d['code']; 
       $dd[$count]['total'] = $d['total']; 

      }else{ 
       $dd[$count]['code'] = $d['code']; 
       $dd[$count]['total'] = $d['total']; 
       $count++; 

      } 

      $old_lc = $d['code']; 
      $old_lcv = $d['total']; 
     } 

     $data = $dd; 

但這似乎並沒有工作。還我需要的$數據陣列來保持密鑰,並應繼續以相同的格式

回答

2

該代碼轉換上述陣列成代碼=>總的陣列。

$out = array(); 
foreach ($data as $k => $v) { 
    $out[$v['code']] += $v['total']; 
} 

值得注意的是,在某些設置下,這會產生一個關於未定義索引的警告。如果這是

$out = array(); 
foreach ($data as $k => $v) { 
    if (array_key_exists($v['code'], $out)) { 
    $out[$v['code']] += $v['total']; 
    } else { 
    $out[$v['code']] = $v['code']; 
    } 
} 

這把它放回像原來的,你想要什麼:如果這困擾你,你可以用這個替代版本

$output = array(); 
foreach ($out as $code => $total) { 
    $output[] = array('code' => $code, 'total' => $total); 
} 

注:原來的鑰匙$data沒有維護,但沒有說明這是一個要求。如果是,則需要指定如何重構具有相同代碼的多個元素。

3
$result = array(); 
    foreach($ary as $elem) { 
    $code = $elem['code']; 
    $total = $elem['total']; 
    if(!isset($result[$code])) 
      $result[$code] = 0; 
    $result[$code] += $total; 
    } 
0
 
    [6] => Array 
     (
      [code] => 642 
      [total] => 1708 
     ) 

    [7] => Array 
     (
      [code] => 642 
      [total] => 53 
     ) 

    [8] => Array 
     (
      [code] => 642 
      [total] => 1421 
     ) 

 
$data_rec = array(); 
$data = array(); 
foreach($data_rec as $key=>$rec) 
{ 
    $data[$key]+= $rec[$key]; 
} 
print_r($data);