2016-01-20 78 views
0

嗨,我很难跟踪多维数组。如何添加数组如果键值相同

[ 
    0 => array:7 [ 
     "date" => "2016-01-19" 
     "placement_id" => 1 
     "requests" => 18 
     "revenue" => 1 
    ], 
    1 => array:7 [ 
     "date" => "2016-01-19" 
     "placement_id" => 1 
     "requests" => 2 
     "revenue" => 0.2 
    ] 
]; 

如果PLACEMENT_ID是相同的,我想导致数组:

 1 => array:7 [ 
      "date" => "2016-01-19" 
      "placement_id" => 1 
      "requests" => 20 
      "revenue" => 1.2 
     ] 
+0

请分享你所拥有你试图 – Tommy

回答

2

要求是产生具有输出数组:

  • 物品用具有相加的“请求”和revenue相同的“PLACEMENT_ID”。
  • 输出数组中输入项的关键是'placement_id'。

这意味着输出数组将小于输入数组。

我决定使用array_reduce函数。没有特别的原因,foreach循环工作正常。它不是更有效率。它只是不同而已。

array_reduce左右的重要的一点是,$carry(累加器)可以是array ...

Working example at Eval.in

的代码:

$outArray = array(); 

$outArray = array_reduce($src, 
        function($carry, $item) { // accumulate values if possible 

         $carryKey = $item['placement_id']; // array key 

         if (isset($carry[$carryKey])) { // accumulate values 

          $carry[$carryKey]['requests'] += $item['requests']; 
          $carry[$carryKey]['revenue'] += $item['revenue']; 

         } else { // is new - add to the output... 

          $carry[$carryKey] = $item; 
         } 
         return $carry; 
        }, 
        array() /* accumulator ($carry) is an internal variable */); 

输出数组:

array (2) [ 
    '1' => array (4) [ 
     'date' => string (10) "2016-01-19" 
     'placement_id' => integer 1 
     'requests' => integer 20 
     'revenue' => float 1.2 
    ] 
    '666' => array (4) [ 
     'date' => string (10) "2016-04-01" 
     'placement_id' => integer 666 
     'requests' => integer 266 
     'revenue' => float 666.20000000000005 
    ] 
] 

测试D ATA:

$src = array(
    0 => array(
     "date" => "2016-01-19", 
     "placement_id" => 1, 
     "requests" => 18, 
     "revenue" => 1, 
    ), 
    1 => array(
     "date" => "2016-04-01", 
     "placement_id" => 666, 
     "requests" => 266, 
     "revenue" => 666.2, 
    ), 
    2 => array(
     "date" => "2016-01-19", 
     "placement_id" => 1, 
     "requests" => 2, 
     "revenue" => 0.2, 
    ), 
); 
+0

它非常整齐和短,谢谢瑞安:) – Cowboy

1

采取这一$arr参数是您展示数组,我们可以创建这样一个功能,查找重复的ID和它们聚集。 $output数组将返回结果。

public function checkArray($arr) { 

    $output = array(); 
    $deleted = array(); 
    foreach($arr as $key => $value){ 
     if (!in_array($key, $deleted)) { 
      $entry = array(); 
      $entry['date'] = $value['date']; 
      $entry['placement_id'] = $value['placement_id']; 
      $entry['requests'] = $value['requests']; 
      $entry['revenue'] = $value['revenue']; 
      foreach($arr as $key2 => $value2){ 
       if($key != $key2 && $value['placement_id'] == $value2['placement_id']){ 
        $entry['requests'] += $value2['requests']; 
        $entry['revenue'] += $value2['revenue']; 
        $deleted[] = $key2; 
       } 
      } 
      $output[] = $entry; 
     } 
    } 
    return $output; 
} 
+0

感谢ü这么多汤米 – Cowboy

+0

@Cowboy我只是希望你把你的时间来了解该解决方案,而不是只是在做复制和粘贴:) – Tommy

+0

感谢您UR的关注! !我会消化它汤米:) – Cowboy

相关问题