首页 > 解决方案 > PHP数组总和和分组重复

问题描述

我有这个数组:

$statuses = ['PROSPECT','BACKLOG','PROSPECT'];
$of_tranxs = [2,1,2];
$revs = [3,1,3];
$mgps = [4,1,4];

我想按重复状态求和。输出这样的数组:

array(
  'status' => ['PROSPECT','BACKLOG'],
  'of_tranx' => [4,1],
  'rev' => [6,1],
  'mgp' => [8,1]
)

我正在使用 PHP 7.4

我尝试过以下方法:

$result = array_zip_combine(
        ['status', 'of_tranx', 'rev', 'mgp'], 
        $statuses, $of_tranxs, $revs, $mgps
    );

然后我 foreach 但结果不是我想要的。

标签: php

解决方案


您可以在原始数组中执行求和,然后在执行单个循环后重新索引并合并它们。我希望这是相当有效的,我认为它会很容易阅读和维护。

代码:(演示

foreach ($statuses as $index => $status) {
    if (!isset($found[$status])) {
        $found[$status] = $index;
        continue;
    }
    $of_tranxs[$found[$status]] += $of_tranxs[$index];
    $revs[$found[$status]] += $revs[$index];
    $mgps[$found[$status]] += $mgps[$index];
    unset($statuses[$index], $of_tranxs[$index], $revs[$index], $mgps[$index]);
}
var_export([
    'status' => array_values($statuses),
    'of_tranx' => array_values($of_tranxs),
    'rev' => array_values($revs),
    'mgp' => array_values($mgps)
]);

或者通过维护一个新的索引递增变量可能更简单:(Demo

$result = [];
$i = 0;
foreach ($statuses as $oldIndex => $status) {
    if (!isset($newIndex[$status])) {
        $newIndex[$status] = $i++;
        $result['status'][] = $status;
        $result['of_tranx'][] = $of_tranxs[$oldIndex];
        $result['rev'][] = $revs[$oldIndex];
        $result['mgp'][] = $mgps[$oldIndex];
    } else {
        $result['of_tranx'][$newIndex[$status]] += $of_tranxs[$oldIndex];
        $result['rev'][$newIndex[$status]] += $revs[$oldIndex];
        $result['mgp'][$newIndex[$status]] += $mgps[$oldIndex];
    }
}
var_export($result);

Outputm(来自两个片段):

array (
  'status' => 
  array (
    0 => 'PROSPECT',
    1 => 'BACKLOG',
  ),
  'of_tranx' => 
  array (
    0 => 4,
    1 => 1,
  ),
  'rev' => 
  array (
    0 => 6,
    1 => 1,
  ),
  'mgp' => 
  array (
    0 => 8,
    1 => 1,
  ),
)

推荐阅读