2016-01-20 4 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

Требование, чтобы получить выходной массив, который содержит:

  • Элементы с одной и той же «PLACEMENT_ID» имеет «» и запросы revenue суммированные.
  • Ключевым элементом записи в выходном массиве будет «place_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 ата:

$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 параметром является массив, который вы показываете, мы могли бы создать такую ​​функцию для поиска дубликатов идентификаторов и агрегировать их. Массив $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

Спасибо за ур озабоченность! ! Я перевариваю его Томми :) – Cowboy

Смежные вопросы