сумма дубликатов в массиве php

Я не уверен, какую функцию искать в отношении этого так не могу, похоже, помочь себе. Похоже на очевидную проблему. У меня есть массив, и где у меня есть дубликаты ключей, я хочу добавить значения. например:

Это раздел моего массива.

[1] => Array ( [inputAvg] => 21.41 KB [outputAvg] => 22.03 KB [date] => 2011-08-01 ) [2] => Array ( [inputAvg] => 182.63 KB [outputAvg] => 186.05 KB [date] => 2011-08-01 ) [3] => Array ( [inputAvg] => 182.63 KB [outputAvg] => 186.05 KB [date] => 2011-08-02 ) [4] => Array ( [inputAvg] => 4.84 MB [outputAvg] => 4.93 MB [date] => 2011-08-03 ) 

Все, что я хочу сделать, это сказать, скажем, где ключ даты массива один и тот же (например, здесь 2011-08-01) Я хочу показать эту дату один раз, но с комбинированными значениями повторяющегося элемента ….?

например

 [1] => Array ( [inputAvg] => 204.04 KB [outputAvg] => 208.08 KB [date] => 2011-08-01 ) [2] => Array ( [inputAvg] => 182.63 KB [outputAvg] => 186.05 KB [date] => 2011-08-02 ) [3] => Array ( [inputAvg] => 4.84 MB [outputAvg] => 4.93 MB [date] => 2011-08-03 ) 

Solutions Collecting From Web of "сумма дубликатов в массиве php"

 <?php $array = array(Array("inputAvg" => 21.41,"outputAvg" => 22.03,"date" => "2011-08-01"), Array("inputAvg" => 182.63,"outputAvg" => 186.05,"date" => "2011-08-01" ), Array("inputAvg" => 182.63, "outputAvg" => 186.05,"date" => "2011-08-02") ); $res = array(); foreach($array as $vals){ if(array_key_exists($vals['date'],$res)){ $res[$vals['date']]['inputAvg'] += $vals['inputAvg']; $res[$vals['date']]['outputAvg'] += $vals['outputAvg']; $res[$vals['date']]['date'] = $vals['date']; } else{ $res[$vals['date']] = $vals; } } echo "<pre>"; print_r($res); ?> 

Вывод :

 Array ( [2011-08-01] => Array ( [inputAvg] => 204.04 [outputAvg] => 208.08 [date] => 2011-08-01 ) [2011-08-02] => Array ( [inputAvg] => 182.63 [outputAvg] => 186.05 [date] => 2011-08-02 ) ) 

Попробуй это ;

 $new = array() ; foreach ($stats as $traffic){ $key = $traffic['date'] ; if (isset($new[$key])){ if ($new[$key]['date'] === $traffic['date']){ $new[$key]['inputAvg'] += $traffic['inputAvg'] ; $new[$key]['outputAvg'] += $traffic['outputAvg'] ; } } else { $new[$key] = $traffic ; } } var_dump($new) ; 

Отредактированный TYPO, поэтому он работает сейчас.

Предположим, что в $ data есть все данные, которые вы хотите обработать

 $dateArray = array(); foreach($data as $key => $value){ if(in_array($value['date'], $dateArray)){ $newArray[$value['date']]['inputAvg'] = $value['inputAvg'] + $newArray[$value['date']]['inputAvg']; $newArray[$value['date']]['outputAvg'] = $value['outputAvg'] + $newArray[$value['date']]['outputAvg']; } else{ $dateArray[] = $value['date']; $newArray[$value['date']] = $value; } } 

Но помните, что добавление просто добавит ваши средние значения и не покажет KB / MB в конце. Вам придется манипулировать им.

Вот решение, которое учитывает KB, MB и GB

Функция для получения абсолютного значения из KB, MB и GB

 function mul($unit) { $mul = 1; switch($unit) { case 'GB': $mul *= 1000; case 'MB': $mul *= 1000; case 'KB': $mul *= 1000; } return $mul; } 

Функция для создания строки из числа, деленная на G, M или K и добавление постфикса

 function demul($val) { $units = array('GB','MB','KB'); $unit = ' '; $m = 1000000000; for ($i=0 ; $i<3 ; $i++) { if ($val >= $m) { $val /= $m; $unit = $units[$i]; break; } $m /= 1000; } return number_format($val, 2) . ' ' . $unit; } 

Основной цикл, $arr – это исходный массив; заполнение массива dates с суммированными данными

 $dates = array(); foreach ($arr as $key => $a) { $d = $a['date']; $i = explode(' ', $a['inputAvg']); $o = explode(' ', $a['outputAvg']); $in = $i[0] * mul($i[1]); $out = $o[0] * mul($o[1]); if ( ! isset($dates[$d])) { $dates[$d] = array($in, $out); } else { $dates[$d][0] += $in; $dates[$d][1] += $out; } } 

Сделать массив result на основе исходного формата

 $result = array(); $n = 1; foreach ($dates as $d => $a) { $result[$n++] = array('date' => $d, 'inputAvg' => demul($a[0]), 'outputAvg' => demul($a[1])); } 

Результат печати

 print_r($result); 

Учитывая данные

 $arr = array( '1' => Array ( 'inputAvg' => '21.41 KB', 'outputAvg' => '22.03 KB', 'date' => '2011-08-01', ), '2' => Array ( 'inputAvg' => '182.63 KB', 'outputAvg' => '186.05 KB', 'date' => '2011-08-01', ), '3' => Array ( 'inputAvg' => '182.63 KB', 'outputAvg' => '186.05 KB', 'date' => '2011-08-02', ), '4' => Array ( 'inputAvg' => '4.84 MB', 'outputAvg' => '4.93 MB', 'date' => '2011-08-03', ) ); 

Он дает результат

 Array ( [1] => Array ( [date] => 2011-08-01 [inputAvg] => 204.04 KB [outputAvg] => 208.08 KB ) [2] => Array ( [date] => 2011-08-02 [inputAvg] => 182.63 KB [outputAvg] => 186.05 KB ) [3] => Array ( [date] => 2011-08-03 [inputAvg] => 4.84 MB [outputAvg] => 4.93 MB ) )