$jawabanRentan) { // Jika jawaban bukan "Pilih Rentan Jawaban", maka tambahkan ke array if ($jawabanRentan !== "Pilih Rentan Jawaban") { $kodeGejala = 'G' . ($index + 1); // Menggunakan index untuk menentukan kode gejala // Ambil data gejala berdasarkan kode gejala $gejala = Gejala::where('kode_gejala', $kodeGejala)->first(); // Ambil nilai user berdasarkan rentan yang dipilih $nilaiUser = Nuser::where('rentan', $jawabanRentan)->value('nilai_user') ?? null; // Tambahkan detail gejala ke dalam array jika gejala ditemukan if ($gejala) { // Iterasi melalui setiap nilai pakar yang terkait dengan gejala tersebut foreach ($this->getNilaiPakarFromNpakar($gejala->kode_gejala) as $penyakit => $nilaiPakar) { // Periksa apakah penyakit tersebut sudah ada dalam array gejalaDipilih if (!isset($gejalaDipilih[$penyakit])) { // Jika belum ada, inisialisasi array untuk penyakit tersebut $gejalaDipilih[$penyakit] = [ 'penyakit' => $penyakit, 'gejala' => [] ]; // Inisialisasi nomor urut CF $cfCounterPerPenyakit[$penyakit] = 0; } // Tambahkan nomor urut CF $cfCounter = ++$cfCounterPerPenyakit[$penyakit]; $cfKey = 'cf' . $cfCounter; // Tambahkan gejala ke dalam array penyakit yang sesuai $gejalaDipilih[$penyakit]['gejala'][] = [ 'kode_gejala' => $gejala->kode_gejala, 'nama_gejala' => $gejala->nama_gejala, 'pilihan_jawaban' => $jawabanRentan, 'nilai_user' => $nilaiUser, // Tambahkan nilai user ke dalam array 'nilai_pakar' => $nilaiPakar, // Tambahkan nilai pakar ke dalam array $cfKey => $nilaiUser * $nilaiPakar, // Tambahkan nilai CF ke dalam array ]; } } } } // Hitung CFK untuk setiap gejala yang dipilih foreach ($gejalaDipilih as $penyakit => &$detailPenyakit) { $gejalaPenyakit = &$detailPenyakit['gejala']; $cfCounter = 0; // Inisialisasi hitungan nilai CF yang digunakan $cfUsed = []; // Array untuk menyimpan nilai CF yang digunakan dalam perhitungan CFK foreach ($gejalaPenyakit as &$gejala) { // Pastikan setiap gejala memiliki CF sebelum mengaksesnya foreach ($gejala as $key => $value) { if (strpos($key, 'cf') === 0 && is_numeric(substr($key, 2))) { $cfUsed[$key] = $value; // Tambahkan nilai CF yang digunakan ke dalam array $cfCounter++; // Hitung jumlah nilai CF yang digunakan } } } // Lakukan perhitungan CFK hanya jika ada minimal dua nilai CF yang digunakan $cfUsedArr = []; foreach($cfUsed as $c => $v) { $cfUsedArr[] = $v; } if ($cfCounter >= 2) { // Hitung CFK1 $cfk1 = $cfUsed['cf1'] + $cfUsed['cf2'] * (1 - $cfUsed['cf1']); $detailPenyakit['cf']['cfk1'] = $cfk1; $detailPenyakit['cf']['cf_used'] = max($cfUsedArr); // Perhitungan CFK untuk nilai CF yang lebih dari 2 $cfkPrev = $cfk1; // Simpan nilai CFK sebelumnya for ($i = 2; $i < $cfCounter; $i++) { $cfKey = 'cf' . ($i + 1); $cfk = $cfkPrev + $cfUsed[$cfKey] * (1 - $cfkPrev); $detailPenyakit['cf']['cfk' . $i] = $cfk; $cfkPrev = $cfk; // Simpan nilai CFK sebelumnya untuk iterasi berikutnya } } elseif ($cfCounter === 1) { // Jika hanya ada satu nilai CF yang digunakan, gunakan nilai tersebut sebagai nilai CFK $detailPenyakit['cf']['cf_used'] = max($cfUsedArr); } } return $gejalaDipilih; } private function getNilaiPakarFromNpakar($kodeGejala) { // Mengambil semua data penyakit yang memiliki gejala yang sama dari tabel Npakar $penyakit = Npakar::where('kode_gejala', $kodeGejala)->get(); // Inisialisasi array untuk menyimpan nilai pakar untuk setiap penyakit $nilaiPakarPerPenyakit = []; // Looping untuk setiap data penyakit yang memiliki gejala yang sama foreach ($penyakit as $data) { // Menyimpan nilai pakar ke dalam array dengan key berdasarkan nama penyakit $nilaiPakarPerPenyakit[$data->nama_penyakit] = $data->nilai_pakar; } return $nilaiPakarPerPenyakit; } public function hasilAnalisis(Request $request) { // Simpan hari, tanggal, dan waktu dalam sesi jika belum ada if (!session()->has('hariTanggal')) { session(['hariTanggal' => now()->locale('id_ID')->setTimezone('Asia/Jakarta')->isoFormat('dddd, D MMMM YYYY')]); } if (!session()->has('waktu')) { session(['waktu' => now()->locale('id_ID')->setTimezone('Asia/Jakarta')->isoFormat('HH:mm:ss')]); } // Validasi request $request->validate([ 'pilihan_jawaban.*' => 'required', ]); // Ambil data jawaban dari request $jawaban = $request->input('pilihan_jawaban'); // Inisialisasi array untuk menyimpan jawaban beserta informasi kode gejala, nama gejala, dan pilihan jawaban $jawabanDenganInfo = []; // Looping untuk setiap jawaban yang dipilih foreach ($jawaban as $index => $jawabanRentan) { // Jika jawaban bukan "Pilih Rentan Jawaban", maka tambahkan ke array if ($jawabanRentan !== "Pilih Rentan Jawaban") { $kodeGejala = 'G' . ($index + 1); // Menggunakan index untuk menentukan kode gejala // Ambil data gejala berdasarkan kode gejala $gejala = Gejala::where('kode_gejala', $kodeGejala)->first(); // Tambahkan informasi kode gejala, nama gejala, dan pilihan jawaban ke dalam array jawabanDenganInfo if ($gejala) { $jawabanDenganInfo[] = [ 'kode_gejala' => $kodeGejala, 'nama_gejala' => $gejala->nama_gejala, 'pilihan_jawaban' => $jawabanRentan, ]; } } } // Gunakan $jawabanDenganInfo di sini untuk keperluan selanjutnya // Ambil data gejala dipilih $gejalaDipilih = $this->getGejalaDipilih($jawaban); // Inisialisasi nilai certainty factor total untuk setiap penyakit $cfTotalPerPenyakit = []; // Looping untuk setiap penyakit foreach ($gejalaDipilih as $penyakit => $detailPenyakit) { // Inisialisasi nilai CFK untuk setiap penyakit $cfk = 1; // Hitung nilai CFK untuk setiap gejala pada penyakit tersebut foreach ($detailPenyakit['gejala'] as $gejala) { // Pastikan kunci cf_used tersedia di dalam array gejala if (isset($gejala['cf_used'])) { $cfk *= (1 - $gejala['cf_used']); } } // Simpan nilai CFK untuk penyakit tersebut $cfTotalPerPenyakit[$penyakit] = $cfk; } // Temukan nama penyakit dengan gejala terbanyak $penyakitTerbanyak = null; $jumlahGejalaTerbanyak = 0; foreach ($gejalaDipilih as $penyakit => $detailPenyakit) { if(isset($detailPenyakit['cf']['cfk1'])) { $jumlahGejala = count($detailPenyakit['gejala']); if ($jumlahGejala >= $jumlahGejalaTerbanyak) { $jumlahGejalaTerbanyak = $jumlahGejala; $penyakitTerbanyak = $penyakit; } }else{ $jumlahGejala = $detailPenyakit['cf']['cf_used']; if ($jumlahGejala > $jumlahGejalaTerbanyak) { $jumlahGejalaTerbanyak = $jumlahGejala; $penyakitTerbanyak = $penyakit; } } } // dd($gejalaDipilih[$penyakitTerbanyak]); // Ambil kunci terakhir dari array gejala yang dipilih untuk penyakit dengan gejala terbanyak $keys = array_keys($gejalaDipilih[$penyakitTerbanyak]); // $lastKey = end($keys); // $lastKey = 0; // foreach($keys as $gejalaPenyakitTerpilih) // { // if(is_array($gejalaPenyakitTerpilih)) // { // foreach($gejalaPenyakitTerpilih as $g) // { // } // } // } // Ambil nilai CFK terakhir dari array gejala yang dipilih $cfkTerakhir = $gejalaDipilih[$penyakitTerbanyak]['cf'] ?? []; // dd($gejalaDipilih[$penyakitTerbanyak]); $listCfkTertinggi = []; $cfkTerakhirHasil = 0; foreach($cfkTerakhir as $c) { // if(is_array($c)) // { // $cfkList = []; // foreach($c as $cc) // { // $cfkList[] = $cc; // } // $listCfkTertinggil[] = max($cfkList); // }else{ $listCfkTertinggi[] = $c; // } } $cfkTerakhirHasil = max($listCfkTertinggi); // Kalikan dengan 100 untuk mendapatkan persentase // $cfkTerakhirPersen = $cfkTerakhir * 100; $cfkTerakhirPersen = round($cfkTerakhirHasil * 100, 2); // Membulatkan ke dua angka di belakang koma // dd($cfkTerakhir); // Ambil deskripsi penyakit, saran penanganan, dan saran pencegahan dari database $penyakit = Penyakit::where('nama_penyakit', $penyakitTerbanyak)->first(); $deskripsiPenyakit = $penyakit->deskripsi_penyakit; $saranPenanganan = $penyakit->saran_penanganan; $saranPencegahan = $penyakit->saran_pencegahan; // Cari penanganan berdasarkan nama penyakit_gejala_terbanyak $penanganan = Penanganan::where('nama_penyakit', $penyakitTerbanyak)->first(); $saranPenangananLanjutan = $penanganan->saran_penanganan_lanjutan; // Tampilkan nilai-nilai perhitungan menggunakan dd() // dd([ // 'cf_total_per_penyakit' => $cfTotalPerPenyakit, // 'jawaban' => $jawabanDenganInfo, // 'gejala_dipilih' => $gejalaDipilih, // 'hasil_analisis' => [ // 'penyakit_gejala_terbanyak' => $penyakitTerbanyak, // 'cfk_terakhir' => $cfkTerakhir, // 'cfk_persen'=> $cfkTerakhirPersen, // 'deskripsi_penyakit' => $deskripsiPenyakit, // 'saran_penanganan' => $saranPenanganan, // 'saran_pencegahan' => $saranPencegahan, // ], // 'perawatan_hari_1' => $perawatanHari1, // 'perawatan_hari_2' => $perawatanHari2, // ]); // $hasilAnalisis = [ // 'jawabanDenganInfo' => $jawabanDenganInfo, // 'gejalaDipilih' => $gejalaDipilih, // 'cfTotalPerPenyakit' => $cfTotalPerPenyakit, // 'penyakitTerbanyak' => $penyakitTerbanyak, // 'cfkTerakhir' => $cfkTerakhir, // 'cfkTerakhirPersen' => $cfkTerakhirPersen, // 'deskripsiPenyakit' => $deskripsiPenyakit, // 'saranPenanganan' => $saranPenanganan, // 'saranPencegahan' => $saranPencegahan, // ]; // Membuat array baru hanya dengan nama gejala yang dipilih $gejala = []; foreach ($gejalaDipilih as $info) { foreach ($info['gejala'] as $gejalaItem) { // Tambahkan nama gejala ke dalam array jika belum ada if (!in_array($gejalaItem['nama_gejala'], $gejala)) { $gejala[] = $gejalaItem['nama_gejala']; } } } // dd($gejalaDipilih); // Mengonversi array ke dalam format JSON //$data_analisis_dugaan = implode(', ', $gejala); $data_analisis_dugaan = json_encode($gejala); // Menyimpan data ke dalam database Riwayat::create([ 'username' => auth()->user()->username, 'datetime' => now()->setTimezone('Asia/Jakarta'), // Menggunakan now() untuk mendapatkan waktu saat ini dan kemudian mengatur zona waktunya 'jawabanDenganInfo' => $data_analisis_dugaan, 'penyakitTerbanyak' => $penyakitTerbanyak, 'cfkTerakhirPersen' => $cfkTerakhirPersen, 'saranPenanganan' => $saranPenanganan, // Menggunakan variabel $saranPenanganan yang sudah didefinisikan sebelumnya 'saran_penanganan_lanjutan' => $saranPenangananLanjutan, ]); return view('analisis.hasil-analisis', compact('jawaban', 'jawabanDenganInfo', 'cfTotalPerPenyakit', 'penyakitTerbanyak', 'cfkTerakhirHasil', 'cfkTerakhirPersen', 'deskripsiPenyakit', 'saranPenanganan', 'saranPencegahan', 'gejalaDipilih')); } private function getNilaiPakar($kodeGejala) { // Ambil nilai pakar dari tabel Npakar berdasarkan kode gejala return Npakar::where('kode_gejala', $kodeGejala)->value('nilai_pakar') ?? 0; } private function getNilaiUser($kodeGejala) { // Ambil nilai user dari tabel Nuser berdasarkan kode gejala return Nuser::where('rentan', $kodeGejala)->value('nilai_user') ?? 0; } }