0) { $canGenerate = 0; } else { $nbLots = Prize::count(); if (intval($nbLots) > 0) { $canGenerate = 1; } else { $canGenerate = 0; } } $instantWin = InstantWin::orderBy('appear_date')->get(); return view('bo.instant-win.index', [ 'can_generate' => $canGenerate, 'instant_win' => $instantWin ]); } public function instantWinGenerate() { $start_date = Settings::latest()->value("start_date"); $end_date = Settings::latest()->value("end_date"); $lots = Prize::all(); $begin = new \DateTime($start_date); $end = new \DateTime($end_date); $interval = new \DateInterval('P1D'); $daterange = new \DatePeriod($begin, $interval, $end); $dateGlobal = []; $lotsGlobal = []; foreach ($lots as $k => $lot) { for ($i = 0; $i < $lot->quantity; $i++) { $lotsGlobal[] = [ 'id' => $lot->id, 'name' => $lot->label_one, 'hour' => str_pad(mt_rand(6, 22), 2, "0", STR_PAD_LEFT) . ":" . str_pad(mt_rand(0, 59), 2, "0", STR_PAD_LEFT) . ":00" ]; } } shuffle($lotsGlobal); foreach ($daterange as $date) { array_push($dateGlobal, ['date' => $date->format("Y-m-d"), 'lots' => []]); } $res = $this->generate($lotsGlobal, $dateGlobal, 0); foreach ($res as $date) { foreach ($date['lots'] as $lot) { $iw = new InstantWin(); $iw->prize_id = $lot['id']; $iw->appear_date = date('Y-m-d H:i:s', strtotime($date['date'] . " " . $lot['hour'])); $iw->save(); } } $instantWins = InstantWin::all(); return json_encode($instantWins); } private function generate($lotsGlobal, $dateGlobal, $lotsDone) { $rKey = array_rand($dateGlobal, 1); if ($lotsDone < count($dateGlobal)) { if (count($dateGlobal[$rKey]['lots']) > 0) { return $this->generate($lotsGlobal, $dateGlobal, $lotsDone); } } array_push($dateGlobal[$rKey]['lots'], $lotsGlobal[$lotsDone++]); if ($lotsDone < count($lotsGlobal)) { return $this->generate($lotsGlobal, $dateGlobal, $lotsDone); } foreach ($dateGlobal as $k => $date) { usort($dateGlobal[$k]['lots'], [$this, 'sortFunction']); } return $dateGlobal; } private function sortFunction($a, $b) { return strtotime($a["hour"]) - strtotime($b["hour"]); } }