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