fork download
  1. <?php
  2.  
  3. function agruparPorIntervalo($dados, $intervaloMeses = 3) {
  4. $resultado = [];
  5.  
  6. foreach ($dados as $entrada) {
  7. $produto = $entrada['produto'];
  8. $data = new DateTime($entrada['data']);
  9. $chaveIntervalo = $data->format('Y') . '-' . ceil($data->format('n') / $intervaloMeses);
  10.  
  11. if (!isset($resultado[$produto][$chaveIntervalo])) {
  12. $resultado[$produto][$chaveIntervalo] = [
  13. 'quantidade' => 0,
  14. 'inicio' => clone $data,
  15. 'fim' => (clone $data)->modify('+' . ($intervaloMeses - 1) . ' months')->modify('last day of this month'),
  16. ];
  17. }
  18.  
  19. $resultado[$produto][$chaveIntervalo]['quantidade'] += $entrada['quantidade'];
  20. }
  21.  
  22. return $resultado;
  23. }
  24.  
  25. // Exemplo de uso
  26. $entradas = [
  27. ['produto' => 'Prod_A', 'quantidade' => 100, 'data' => '2024-01-15'],
  28. ['produto' => 'Prod_A', 'quantidade' => 120, 'data' => '2024-03-20'],
  29. ['produto' => 'Prod_A', 'quantidade' => 105, 'data' => '2024-04-10'],
  30. ['produto' => 'Prod_B', 'quantidade' => 105, 'data' => '2024-02-05'],
  31. ['produto' => 'Prod_B', 'quantidade' => 120, 'data' => '2024-03-15'],
  32. ['produto' => 'Prod_B', 'quantidade' => 130, 'data' => '2024-04-25'],
  33. ];
  34.  
  35. $resultadoAgrupado = agruparPorIntervalo($entradas);
  36.  
  37. // Exibir resultado
  38. foreach ($resultadoAgrupado as $produto => $intervalos) {
  39. echo "Produto: $produto\n";
  40. foreach ($intervalos as $intervalo) {
  41. echo " Quantidade: {$intervalo['quantidade']}, ";
  42. echo "Período: {$intervalo['inicio']->format('m/Y')} - {$intervalo['fim']->format('m/Y')}\n";
  43. }
  44. echo "========================\n";
  45. }
Success #stdin #stdout 0.03s 26264KB
stdin
Standard input is empty
stdout
Produto: Prod_A
  Quantidade: 220, Período: 01/2024 - 03/2024
  Quantidade: 105, Período: 04/2024 - 06/2024
========================
Produto: Prod_B
  Quantidade: 225, Período: 02/2024 - 04/2024
  Quantidade: 130, Período: 04/2024 - 06/2024
========================