belongsTo(Evento::class); } public function horaFlags() { return $this->hasMany(HoraFlag::class); } // ordena las horaFlags asociadas a día por minutoDelDía, de menor a mayor; // las recorre sumando las flags asociadas a cada una y guardándo el número en cant_actual; // cuando cant_actual supera a la cantidad guardada en best, se hace un nuevo best: // se pone best["cantidad"] = cant_actual, en best["inicio"] el minutoDelDia de la hora actual // y en best["fin"] el minutoDelDía de la hora siguiente (esta hora existe porque si cant_actual // crece es porque llega a alguien, y por lo tanto hay una hora posterior en la que se va). // finalmente se devuelve best, con la duración del horario devuelto. public function marzullo(): array { // INICIO $cant_actual = 0; $best = ["cantidad" => 0, "inicio" => 0, "fin" => 0]; // Ordenar horaFlags por minutoDelDia $horas = $this->horaFlags()->orderBy('minutoDelDia')->orderBy('flag')->get(); // var_dump($horas); // ALGORITMO foreach ($horas as $i => $hora) { $cant_actual += $hora->flag; if ($cant_actual > $best["cantidad"] && ($horas[$i+1]->flag > 0 || $horas[$i+1]->minutoDelDia - $hora->minutoDelDia > 15)) { $best["cantidad"] = $cant_actual; $best["inicio"] = $hora->minutoDelDia; $best["fin"] = $horas[$i+1]->minutoDelDia; } } // RETURN $duracion = $best["fin"] - $best["inicio"]; return [$best["cantidad"], $best["inicio"], $best["fin"], $duracion]; } }