Мое приложение получает ответы API в этом формате, где первые х-элементы являются строковыми метками и следующие числовые. Количество строковых меток и числовых элементов может варьироваться в зависимости от ответа 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));