['Senin','Rabu Siang','Jumat Siang'], 'Dora' => ['Rabu Sore', 'Kamis Sore'], 'Dewi' => ['Rabu Sore','Kamis Pagi','Ahad'], 'Indro' => ['Selasa Sore','Rabu Sore','Kamis Sore','Sabtu'], 'Dono' => ['Senin','Selasa','Rabu Sore','Kamis Sore','Jumat'], ]; $no_area = [ 'Dewi' => ['Jakarta Barat','noll'] ]; $area = ['Jakarta Barat','Pondok Aren','Ciputat','Pondok Labu','Kebayoran Lama']; $area_detals = ['Jakarta Barat' => ['Grogol','Tanah Abang','Thamrin City'], 'Pondok Aren' => ['Ceger','Japos','Pondok Kacang'], 'Ciputat' => ['UIN','Kasino 1','Kasino 2','ZXC'], 'Pondok Labu' => ['ATK 1','ATK 2','Tex 1','Tex 2','MMM','Gandul 1','Gandul 2'], 'Kebayoran Lama' => ['ATK 1','ATK 2','ATK 3','Tex 1','Tex 2','Tex 3','Sepatu'], ]; $tahun = 2018; $bulan = 1; //=================== ApplyHeader($tahun); $booked = []; $twice = []; $kemarin= []; $ctrKemarin = 0; while ($bulan < 13) { echo "

Bulan : ".$month_list[$bulan]."

\n\n"; $tanggal = 1; // bikin header table bulan echo " "; $hari_ini = getDay($tanggal,$bulan,$tahun); // jika tanggal 1, bikin kolom-kolom kosong s/d ke kolom hari yang benar // hitung jumlah kolom yang perlu dikosongkan $skip = array_search($hari_ini, $hari); // kosongkan kolom for ($i = 1; $i <= $skip; $i++) { echo ""; }; // pilih salah satu hari Sabtu $xSaturday = getRandomSaturday($bulan, $tahun); // pilih salah satu hari Ahad $xSunday = getRandomSunday($bulan, $tahun); // mulai buat daftar keliling bulan ini while (checkdate ($bulan, $tanggal, $tahun)) { $hari_ini = getDay($tanggal,$bulan,$tahun); // jika hari Senin, bikin row baru if ($hari_ini == 'Senin') { echo ""; }; // kalau sabtu / minggu = skip if ( (($hari_ini == 'Sabtu') || ($hari_ini == 'Ahad')) && ($tanggal <> $xSunday) && ($tanggal <> $xSaturday) ) { // do nothing echo ""; } else { // bikin kolom hari echo ""; }; // if (($hari == 'Sabtu') || $hari == 'Ahad') $booked = []; $twice = []; $tanggal++; if ( $ctrKemarin > (sizeof($sdm)+1) ) { $ctrKemarin = 0;}; }; // while (checkdate ($bulan, $tanggal, $tahun)) { $bulan++; // bikin footer table bulan echo "
Senin Selasa Rabu Kamis Jumat Sabtu Ahad
$tanggal

".$hari_ini." : ".$tanggal."


\n\n"; foreach ($area as &$daerah) { // dapatkan waktu do { $x = getRandomNumber(0, sizeof($slot_jadwal)-1); $slot = $slot_jadwal[$x]; $slot_hari = $hari_ini." ".$slot; } while ( in_array($slot_hari, $no_go) ); // dapatkan personil $ctr = 1; $dapat_sdm = false; do { $nomor = getRandomNumber(0, (sizeof($sdm)-1)); $nama = $sdm[$nomor]; $ctr++; // jika $ctr > 10000, berarti ada infinite loop // pecahkan dengan cara sbb : if ($ctr > 1000) { $nama = ''; // temukan orang yang belum ada di $booked[] foreach ($sdm as &$n) { //echo "nama1 ".$n."/".$slot_hari; if (!(in_array($n, $booked)) && !(AdaKonflikJadwal($n, $slot_hari, $no_schedule)) && !(in_array($daerah, $no_area["$n"])) && !(SudahKemarin($n,$daerah,$kemarin)) ) { $nama = $n; }; }; if ($nama <> '') { $booked[] = $nama; if ($nama == 'Devy') { $twice[] = $nama;}; // jika tidak ada, maka ambil dari $booked[] } elseif ($nama == '') { do { $nomor = getRandomNumber(0, (sizeof($booked)-1)); $nama = $booked[$nomor]; } while ( (in_array($nama, $twice)) && SudahKemarin($nama,$daerah,$kemarin) ); $twice[] = $nama; }; // if ($nama == '') $dapat_sdm = true; }; // if ($ctr > 10000) if ($dapat_sdm) { break;}; } while ( (AdaKonflikJadwal($nama, $slot_hari, $no_schedule)) || (in_array($nama, $booked)) || (in_array($daerah, $no_area["$nama"])) || (in_array($nama, $twice)) || SudahKemarin($nama,$daerah,$kemarin) ); $booked[] = $nama; if ($nama == 'Devy') { $twice[] = $nama;}; $kemarin[$ctrKemarin] = [$nama,$daerah]; $ctrKemarin++; // cetak nama & jadwal //echo $daerah." : ".$nama." - ".$slot."\n\n"; echo $daerah." : ".$nama."
\n\n"; }; // foreach ($area as &$daerah) // tutup kolom hari echo "
"; }; // while (bulan < 13) exit(); // end //=================== function getRandomSunday($month, $year) { $month_list = ['0','January','February','March','April','May','June','July','August','September','October','November','December']; $sunday_list = []; $today = 1; // get a list of Sundays while (checkdate($month, $today, $year)) { $curdate = strtotime($today.' '.$month_list[$month].' '.$year); if (date('l', $curdate) == 'Sunday') { $sunday_list[] = $today.'-'.$month_list[$month].'-'.$year; }; $today++; }; // pick a random Sunday $max = sizeof($sunday_list) - 1; $result = getRandomNumber(0, $max); return $sunday_list[$result]; }; function getRandomSaturday($month, $year) { $month_list = ['0','January','February','March','April','May','June','July','August','September','October','November','December']; $sunday_list = []; $today = 1; // get a list of Saturday while (checkdate($month, $today, $year)) { $curdate = strtotime($today.' '.$month_list[$month].' '.$year); if (date('l', $curdate) == 'Saturday') { $sunday_list[] = $today.'-'.$month_list[$month].'-'.$year; }; $today++; }; // pick a random Sunday $max = sizeof($sunday_list) - 1; $result = getRandomNumber(0, $max); return $sunday_list[$result]; }; function getRandomNumber ($min, $max) { // better random seed $x = openssl_random_pseudo_bytes(100); $x = hash('crc32', $x); mt_srand(intval(hexdec($x))); $result = mt_rand($min,$max); //$result = random_int($min,$max); //$src = "https://www.random.org/integers/?num=1&min=".$min."&max=".$max."&col=1&base=10&format=plain&rnd=new"; $dh = fopen("$src",'r'); $result = fread($dh,1); return $result; } function getDay($tanggal, $bulan, $tahun) { $month_list = ['0','January','February','March','April','May','June','July','August','September','October','November','December']; $day = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']; $hari = ['Senin','Selasa','Rabu','Kamis','Jumat','Sabtu','Ahad']; // dapatkan hari $hari_ini = date('l', strtotime($tanggal.' '.$month_list[$bulan].' '.$tahun)); // ubah jadi bahasa Indonesia $pos = array_search($hari_ini, $day); $hari_ini = $hari[$pos]; return $hari_ini; } function AdaKonflikJadwal ($nama, $slot_hari, $no_schedule) { $oke = false; foreach ($no_schedule[$nama] as &$jadwal) { if (strpos($slot_hari, $jadwal) !== false) { $oke = true; //echo "NIH : ".$slot_hari."/".$jadwal; }; }; return $oke; } function SudahKemarin($nama,$daerah,$kemarin) { $sudah = false; foreach ($kemarin as &$v) { if ( ($v[0] == $nama) && ($v[1] == $daerah) ) { $sudah = true; }; }; return $sudah; } function ApplyHeader($tahun) { ?>

Jadwal Keliling tahun