Задать вопрос
besogonskiy
@besogonskiy
работаю php laravel разработчиком.

Как объединить ассоциативных массива по значению полей?

есть два массива, у которых есть поле "date" и есть показатели, например, price и quantity

как объединить эти массивы по полю date так чтобы показатели price и quantity при этом сложились?

$dates1[] = [
    [
        'date' => "01.08.2023",
        'qty' => 100
    ],
    [
        'date' => "02.08.2023",
        'qty' => 15,
    ],
];

$dates1[] = [
    [
        'date' => "01.08.2023",
        'qty' => 0
    ],
    [
        'date' => "03.08.2023",
        'qty' => 25,
    ],
];


$result = [
    [
        'date' => "01.08.2023",
        'qty' => 100
    ],
    [
        'date' => "02.08.2023",
        'qty' => 15,
    ],
    [
        'date' => "03.08.2023",
        'qty' => 25,
    ],
];
  • Вопрос задан
  • 317 просмотров
Подписаться 1 Простой 17 комментариев
Решения вопроса 2
0xD34F
@0xD34F
function merge($arrs, $idKey, ...$sumKeys) {
  $result = [];

  foreach (array_merge(...$arrs) as $n) {
    $id = $n[$idKey];
    $result[$id] ??= array_merge($n, array_combine($sumKeys, array_fill(0, count($sumKeys), 0)));

    foreach ($sumKeys as $k) {
      $result[$id][$k] += $n[$k];
    }
  }

  return array_values($result);
}


$result = merge($dates1, 'date', 'qty');
Ответ написан
Комментировать
profesor08
@profesor08 Куратор тега PHP
function merge($arr) {
	$map = array_reduce(array_merge(...$arr), function($map, $item) {
		$map[$item["date"]] = ($map[$item["date"]] ?? 0) + $item["qty"];
		
		return $map;
	}, []);
	
	return array_map(function($key) use ($map) {
		return [
			"date" => $key,
			"qty" => $map[$key],
		];
	}, array_keys($map));
}


Упарываться можно по разному, например смапить по ключу, а потом переформировать в нужную структуру.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы