Я не уверен, какую функцию искать в отношении этого так не могу, похоже, помочь себе. Похоже на очевидную проблему. У меня есть массив, и где у меня есть дубликаты ключей, я хочу добавить значения. например:
Это раздел моего массива.
[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 )
<?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 ) )