基于同一个键(PHP)将数组值相加

基于同一个键(PHP)将数组值相加,php,Php,我发现了一个案例,我必须根据同一周添加值 [{"week":"30","nilai":"230"},{"week":"30","nilai":"66"},{"week":"29","nilai":"72"},{"week":"29","nilai":"225"},{"week":"28","nilai":"213"},{"week":"28","nilai":"72"},{"week":"27","nilai":"191"},{"week":"27","nilai":"60"},{"week":

我发现了一个案例,我必须根据同一周添加值

[{"week":"30","nilai":"230"},{"week":"30","nilai":"66"},{"week":"29","nilai":"72"},{"week":"29","nilai":"225"},{"week":"28","nilai":"213"},{"week":"28","nilai":"72"},{"week":"27","nilai":"191"},{"week":"27","nilai":"60"},{"week":"26","nilai":"176"},{"week":"26","nilai":"65"},{"week":"25","nilai":"167"},{"week":"25","nilai":"57"},{"week":"24","nilai":"209"},{"week":"24","nilai":"62"},{"week":"23","nilai":"180"},{"week":"23","nilai":"88"},{"week":"22","nilai":"178"},{"week":"22","nilai":"72"},{"week":"21","nilai":"164"},{"week":"21","nilai":"42"},{"week":"20","nilai":"193"},{"week":"20","nilai":"50"},{"week":"19","nilai":"186"},{"week":"19","nilai":"56"}]
我期望的结果是这样的

week => 30,
 nilai=> 296

您可以使用array\u reduce在单个循环中执行此操作

此解决方案执行真正的单次传递,而不在数组中执行任何其他搜索。我还没有对它进行基准测试,但我认为它的性能更好


<?php

$input = '[{"week":"30","nilai":"230"},{"week":"30","nilai":"66"},{"week":"29","nilai":"72"},{"week":"29","nilai":"225"},{"week":"28","nilai":"213"},{"week":"28","nilai":"72"},{"week":"27","nilai":"191"},{"week":"27","nilai":"60"},{"week":"26","nilai":"176"},{"week":"26","nilai":"65"},{"week":"25","nilai":"167"},{"week":"25","nilai":"57"},{"week":"24","nilai":"209"},{"week":"24","nilai":"62"},{"week":"23","nilai":"180"},{"week":"23","nilai":"88"},{"week":"22","nilai":"178"},{"week":"22","nilai":"72"},{"week":"21","nilai":"164"},{"week":"21","nilai":"42"},{"week":"20","nilai":"193"},{"week":"20","nilai":"50"},{"week":"19","nilai":"186"},{"week":"19","nilai":"56"}]';
$input = json_decode($input, true);

$outArr = [];
foreach ($input as $arr) {
    $week = $arr['week'];
    if (key_exists($week, $outArr)) {
        $outArr[$week] += $arr['nilai'];
    } else {
        $outArr[$week] = $arr['nilai'];
    }
}

//optional sort - you may remove it
ksort($outArr);

$outArr2 = [];
foreach($outArr as $week => $nilai) {
    $outArr2[] = ['week' => $week, 'nilai' => $nilai];
}

var_export($outArr2);
array (
  0 => 
  array (
    'week' => 19,
    'nilai' => 242,
  ),
  1 => 
  array (
    'week' => 20,
    'nilai' => 243,
  ),
  2 => 
  array (
    'week' => 21,
    'nilai' => 206,
  ),
  3 => 
  array (
    'week' => 22,
    'nilai' => 250,
  ),
  4 => 
  array (
    'week' => 23,
    'nilai' => 268,
  ),
  5 => 
  array (
    'week' => 24,
    'nilai' => 271,
  ),
  6 => 
  array (
    'week' => 25,
    'nilai' => 224,
  ),
  7 => 
  array (
    'week' => 26,
    'nilai' => 241,
  ),
  8 => 
  array (
    'week' => 27,
    'nilai' => 251,
  ),
  9 => 
  array (
    'week' => 28,
    'nilai' => 285,
  ),
  10 => 
  array (
    'week' => 29,
    'nilai' => 297,
  ),
  11 => 
  array (
    'week' => 30,
    'nilai' => 296,
  ),
)
<?php

$input = '[{"week":"30","nilai":"230"},{"week":"30","nilai":"66"},{"week":"29","nilai":"72"},{"week":"29","nilai":"225"},{"week":"28","nilai":"213"},{"week":"28","nilai":"72"},{"week":"27","nilai":"191"},{"week":"27","nilai":"60"},{"week":"26","nilai":"176"},{"week":"26","nilai":"65"},{"week":"25","nilai":"167"},{"week":"25","nilai":"57"},{"week":"24","nilai":"209"},{"week":"24","nilai":"62"},{"week":"23","nilai":"180"},{"week":"23","nilai":"88"},{"week":"22","nilai":"178"},{"week":"22","nilai":"72"},{"week":"21","nilai":"164"},{"week":"21","nilai":"42"},{"week":"20","nilai":"193"},{"week":"20","nilai":"50"},{"week":"19","nilai":"186"},{"week":"19","nilai":"56"}]';
$input = json_decode($input, true);

$outArr = [];
foreach ($input as $arr) {
    $week = $arr['week'];
    if (key_exists($week, $outArr)) {
        $outArr[$week]['week'] += $arr['nilai'];
    } else {
        $outArr[$week]['nilai'] = $arr['nilai'];
    }
}
print_r($outArr);
?>