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

时间:2015-02-04 00:46:59

标签: php

我的应用程序以此格式获取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)
)

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

2 个答案:

答案 0 :(得分:1)

$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包装器就会删除生成的密钥。

答案 1 :(得分:0)

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

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));