<?php
function agruparPorIntervalo($dados, $intervaloMeses = 3) {
$resultado = [];
foreach ($dados as $entrada) {
$produto = $entrada['produto'];
$data = new DateTime($entrada['data']);
$chaveIntervalo = $data->format('Y') . '-' . ceil($data->format('n') / $intervaloMeses);
if (!isset($resultado[$produto][$chaveIntervalo])) { $resultado[$produto][$chaveIntervalo] = [
'quantidade' => 0,
'inicio' => clone $data,
'fim' => (clone $data)->modify('+' . ($intervaloMeses - 1) . ' months')->modify('last day of this month'),
];
}
$resultado[$produto][$chaveIntervalo]['quantidade'] += $entrada['quantidade'];
}
return $resultado;
}
// Exemplo de uso
$entradas = [
['produto' => 'Prod_A', 'quantidade' => 100, 'data' => '2024-01-15'],
['produto' => 'Prod_A', 'quantidade' => 120, 'data' => '2024-03-20'],
['produto' => 'Prod_A', 'quantidade' => 105, 'data' => '2024-04-10'],
['produto' => 'Prod_B', 'quantidade' => 105, 'data' => '2024-02-05'],
['produto' => 'Prod_B', 'quantidade' => 120, 'data' => '2024-03-15'],
['produto' => 'Prod_B', 'quantidade' => 130, 'data' => '2024-04-25'],
];
$resultadoAgrupado = agruparPorIntervalo($entradas);
// Exibir resultado
foreach ($resultadoAgrupado as $produto => $intervalos) {
echo "Produto: $produto\n";
foreach ($intervalos as $intervalo) {
echo " Quantidade: {$intervalo['quantidade']}, ";
echo "Período: {$intervalo['inicio']->format('m/Y')} - {$intervalo['fim']->format('m/Y')}\n";
}
echo "========================\n";
}
PD9waHAKCmZ1bmN0aW9uIGFncnVwYXJQb3JJbnRlcnZhbG8oJGRhZG9zLCAkaW50ZXJ2YWxvTWVzZXMgPSAzKSB7CiAgICAkcmVzdWx0YWRvID0gW107CiAgICAKICAgIGZvcmVhY2ggKCRkYWRvcyBhcyAkZW50cmFkYSkgewogICAgICAgICRwcm9kdXRvID0gJGVudHJhZGFbJ3Byb2R1dG8nXTsKICAgICAgICAkZGF0YSA9IG5ldyBEYXRlVGltZSgkZW50cmFkYVsnZGF0YSddKTsKICAgICAgICAkY2hhdmVJbnRlcnZhbG8gPSAkZGF0YS0+Zm9ybWF0KCdZJykgLiAnLScgLiBjZWlsKCRkYXRhLT5mb3JtYXQoJ24nKSAvICRpbnRlcnZhbG9NZXNlcyk7CiAgICAgICAgCiAgICAgICAgaWYgKCFpc3NldCgkcmVzdWx0YWRvWyRwcm9kdXRvXVskY2hhdmVJbnRlcnZhbG9dKSkgewogICAgICAgICAgICAkcmVzdWx0YWRvWyRwcm9kdXRvXVskY2hhdmVJbnRlcnZhbG9dID0gWwogICAgICAgICAgICAgICAgJ3F1YW50aWRhZGUnID0+IDAsCiAgICAgICAgICAgICAgICAnaW5pY2lvJyA9PiBjbG9uZSAkZGF0YSwKICAgICAgICAgICAgICAgICdmaW0nID0+IChjbG9uZSAkZGF0YSktPm1vZGlmeSgnKycgLiAoJGludGVydmFsb01lc2VzIC0gMSkgLiAnIG1vbnRocycpLT5tb2RpZnkoJ2xhc3QgZGF5IG9mIHRoaXMgbW9udGgnKSwKICAgICAgICAgICAgXTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHJlc3VsdGFkb1skcHJvZHV0b11bJGNoYXZlSW50ZXJ2YWxvXVsncXVhbnRpZGFkZSddICs9ICRlbnRyYWRhWydxdWFudGlkYWRlJ107CiAgICB9CiAgICAKICAgIHJldHVybiAkcmVzdWx0YWRvOwp9CgovLyBFeGVtcGxvIGRlIHVzbwokZW50cmFkYXMgPSBbCiAgICBbJ3Byb2R1dG8nID0+ICdQcm9kX0EnLCAncXVhbnRpZGFkZScgPT4gMTAwLCAnZGF0YScgPT4gJzIwMjQtMDEtMTUnXSwKICAgIFsncHJvZHV0bycgPT4gJ1Byb2RfQScsICdxdWFudGlkYWRlJyA9PiAxMjAsICdkYXRhJyA9PiAnMjAyNC0wMy0yMCddLAogICAgWydwcm9kdXRvJyA9PiAnUHJvZF9BJywgJ3F1YW50aWRhZGUnID0+IDEwNSwgJ2RhdGEnID0+ICcyMDI0LTA0LTEwJ10sCiAgICBbJ3Byb2R1dG8nID0+ICdQcm9kX0InLCAncXVhbnRpZGFkZScgPT4gMTA1LCAnZGF0YScgPT4gJzIwMjQtMDItMDUnXSwKICAgIFsncHJvZHV0bycgPT4gJ1Byb2RfQicsICdxdWFudGlkYWRlJyA9PiAxMjAsICdkYXRhJyA9PiAnMjAyNC0wMy0xNSddLAogICAgWydwcm9kdXRvJyA9PiAnUHJvZF9CJywgJ3F1YW50aWRhZGUnID0+IDEzMCwgJ2RhdGEnID0+ICcyMDI0LTA0LTI1J10sCl07CgokcmVzdWx0YWRvQWdydXBhZG8gPSBhZ3J1cGFyUG9ySW50ZXJ2YWxvKCRlbnRyYWRhcyk7CgovLyBFeGliaXIgcmVzdWx0YWRvCmZvcmVhY2ggKCRyZXN1bHRhZG9BZ3J1cGFkbyBhcyAkcHJvZHV0byA9PiAkaW50ZXJ2YWxvcykgewogICAgZWNobyAiUHJvZHV0bzogJHByb2R1dG9cbiI7CiAgICBmb3JlYWNoICgkaW50ZXJ2YWxvcyBhcyAkaW50ZXJ2YWxvKSB7CiAgICAgICAgZWNobyAiICBRdWFudGlkYWRlOiB7JGludGVydmFsb1sncXVhbnRpZGFkZSddfSwgIjsKICAgICAgICBlY2hvICJQZXLDrW9kbzogeyRpbnRlcnZhbG9bJ2luaWNpbyddLT5mb3JtYXQoJ20vWScpfSAtIHskaW50ZXJ2YWxvWydmaW0nXS0+Zm9ybWF0KCdtL1knKX1cbiI7CiAgICB9CiAgICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Cn0=