Суммируйте массив в php по столбцам - PullRequest
1 голос
/ 19 марта 2019

У меня есть этот массив:

$result = [
   0 => [
       category   => 'Solution',
       name       => 'Name1',
       value1     => 20
       value2     => 21
   ],
   1 => [
       category   => 'Solution',
       name       => 'Name2',
       value1     => 30,
       value2     => 31
   ],
   2 => [
       category   => 'Solution1',
       name       => 'Name3',
       value1     => 40,
       value2     => 41
   ]
]

Я хочу получить массив:

$new_array = [
    0 => [
        name    => 'Solution',
        value1  => 50   // sum of array with key = 0 and key = 1
        value2  => 52
    ], 
    1 => [
        name    => 'Name1'
        value1  => 20,
        value2  => 21
    ],
    2 => [
        name    => 'Name2',
        value1  => 30,
        value2  => 31
    ],
    3 => [
        name    => 'Solution1',
        value1  => 40,
        value2  => 41
    ],
    4 => [
        name    => 'Name3',
        value1  => 40,
        value2  => 41
    ]
]

Я пытался так:

private function groupByProductSuperCategory($datas)
{
    $return = [];
    foreach ($datas as $data) {
        $return[$data['category']][$data['name']] = array_sum(array_column('category', $data);
    }
    return $return;
}

Идея состоит в том, чтобы сначала вычислить все значения сумм по категориям, а затем просто поместить значения из имени как другой массив. У вас есть идея, как это сделать? Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 19 марта 2019

Из размещенного массива ... Чтобы закончить в нужном массиве, сначала нужно сделать несколько мелких исправлений. Но я предположил, что это произошло из-за опечаток при копировании здесь ...

Итак, вот массив, с которого я начал:

$result = [
  0 => [
    "category"   => 'Solution',
    "name"       => 'Name1',
    "value1"     => 20,
    "value2"     => 21
  ],
  1 => [
    "category"   => 'Solution',
    "name"       => 'Name2',
    "value1"     => 30,
    "value2"     => 31
  ],
  2 => [
    "category"   => 'Solution1',
    "name"       => 'Name3',
    "value1"     => 40,
    "value2"     => 41
  ]
];

Теперь эта реорганизация данных немного сложнее, чем кажется ... Вам нужно выполнить несколько циклов для:

  • Найдите отличные названия "категории"
  • Выполните суммирование для каждого
  • Добавить элемент суммы и отдельные элементы

Итак, вот код, которым я закончил:

function groupByProductSuperCategory($datas){
  $category = [];
  $return = [];

  // Find distinct categories
  foreach ($datas as $data) {
    if(!in_array($data["category"],$category)){
      array_push($category,$data["category"]);
    }
  }

  // For each distinct category, add the sum item and the single items
  foreach ($category as $cat) {

    // Get the sums
    if(!in_array($cat,$return)){

      $sum1 = 0;
      $sum2 = 0;
      foreach ($datas as $data) {
        if($data["category"] == $cat){
          $sum1 += $data["value1"];
          $sum2 += $data["value2"];
        }
      }
    }

    // Push the sums in the return array
    array_push($return,[
      "name" => $cat,
      "value1" => $sum1,
      "value2" => $sum2,
    ]);

    // Push the single elements
    foreach ($datas as $data) {
      if($cat == $data["category"]){
        array_push($return,[
          "name" => $data["name"],
          "value1" => $data["value1"],
          "value2" => $data["value2"],
        ]);
      }
    }


  }

  return $return;

}

Вот PHPFiddle , чтобы попробовать ... Нажмите [F9] для запуска.

...