我的应用程序以此格式获取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)
)
实现这一目标的有效方法是什么?
答案 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));