Объединить массивы с соответствующими строковыми значениями и увеличить числа

0

Мое приложение получает ответы 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)
)

Каким будет эффективный способ достичь этого?

Теги:

2 ответа

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 просто избавляется от сгенерированных ключей.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню