合并具有匹配字符串值的数组并递增数字


Merge arrays with matching string values and increment the numbers

我的应用获取此格式的 API 响应,其中前 x 个元素是字符串标签,下面是数字。字符串标签和数字元素的数量可以因 API 响应而异,但在响应中不会有所不同。

我想将它们合并在一起,以便具有相同字符串标签的行对其数值求和。

以前:

Array(
  Array('one', 'two', 'three', 1, 2),
  Array('one', 'two', 'three', 1, 4),
  Array('one', 'six', 'three', 2, 5),
  Array('one', 'two', 'seven', 5, 9),
  Array('one', 'six', 'three', 6, 1)
)

后:

Array(
  Array('one', 'two', 'three', 2, 6),
  Array('one', 'six', 'three', 8, 6),
  Array('one', 'two', 'seven', 5, 9)
)

实现这一目标的有效方法是什么?

$result = array_values(
    array_reduce($array, function (array $result, array $item) {
        $key = serialize(array_filter($item, 'is_string'));
        if (!isset($result[$key])) {
            $result[$key] = $item;
        } else {
            $result[$key] = array_map(
                function ($a, $b) { return is_int($a) ? $a + $b : $a; },
                $result[$key],
                $item
            );
        }
        return $result;
    }, [])
);

您的数据应采用$array .

从字面上看,关键是简单地为每个数组生成一个唯一标识符,您可以使用该标识符进行重复数据删除;这是通过序列化此处的所有字符串值来完成的。然后,您可以简单地将所有整数重复求和,同时保留字符串,这是通过array_map完成的。然后,array_values包装器只是删除生成的密钥。

你可以试试这种方式,它似乎不是很清楚,但如果你需要,这可能是有用的:

function summarizeArr($arr,$num) {
    $newArr = array();
    foreach($arr as $row) {
        $found = false;
        foreach ($newArr as &$newRow) {
            $ok = true;
            for ($i=0 ; $i<$num; $i++) {
                if ($row[$i] != $newRow[$i]) {
                    $ok = false;
                    continue ;
                }
            }
            if (!$ok) continue;
            for ($i=$num; $i<count($row); $i++) {
                $newRow[$i] = $newRow[$i]+$row[$i];
            }
            $found=true;
            break;
        }
        if (!$found) $newArr[] = $row;
    }
    return $newArr;
}
$arr = Array(
  Array('one', 'two', 'three', 1, 2),
  Array('one', 'two', 'three', 1, 4),
  Array('one', 'six', 'three', 2, 5),
  Array('one', 'two', 'seven', 5, 9),
  Array('one', 'six', 'three', 6, 1)
);
print_r (summarizeArr($arr,3));