Hitung

 avatar
unknown
php
3 years ago
3.0 kB
3
Indexable
 public function hitung(Request $request)
    {
        // get semua data penyakit
        $listPenyakit = Penyakit::all();

        //mengambil data dari user melalui request
        $collected = json_decode($request->hasil);
        $result = array();
        foreach ($listPenyakit as $penyakit) {
            // $penyakit = Penyakit::find(5);

            $rules = $penyakit->gejala()->get()->sortBy('kode');
            $gUser = collect($collected);
            $hasil = $gUser->whereIn('kode', $rules->pluck('kode'));
            foreach ($hasil as $key => $value) {
                $hasil[$key] = collect($value)->put('nilai_pakar', $rules->firstWhere('kode', $value->kode)->pivot->nilai_pakar);
            }

            $gejalaUser = collect($hasil->values())->map(function ($value, $key) {

                return ['CF' => round($value['nilai_pakar'] * $value['nilai_user'], 2)];
            });
            // dd($gejalaUser->toArray());
            $cfCombine = 0;

            foreach ($gejalaUser->values() as $key => $value) {
                $r = null;
                if ($gejalaUser->count() == 1) {
                    $cfCombine = $value['CF'];
                    $cfFinal = $cfCombine;
                    $r = ([
                        'id' => $penyakit->id,
                        'nama_penyakit' => $penyakit->nama,
                        'persentase' => round($cfFinal, 2) * 100,
                    ]);
                    break;
                } else {
                    switch ($key) {
                        case 0:
                            $cf1 = $value['CF'];
                            $cf2 = $gejalaUser->get(++$key)['CF'];
                            $cf = $cf1 + $cf2 * (1 - $cf1);
                            $cfCombine = $cf;
                            break;
                        case 1:
                            break;
                        case $gejalaUser->count():
                            break;

                        default:
                            $cfOld = $cfCombine;
                            $currentCF = $value['CF'];
                            $cf = $cfOld + ($currentCF * (1 - $cfOld));
                            $cfCombine = $cf;
                            break;
                    }
                    //lempar resul combine ke variable
                    $cfFinal = $cfCombine;
                    $r = ([
                        'id' => $penyakit->id,
                        'nama_penyakit' => $penyakit->nama,
                        'persentase' => round($cfFinal, 2) * 100,
                    ]);
                }
            }
            //menambahkan data
            $result[] = $r;
        }
        usort(
            $result,
            function ($a, $b) {
                return $b['persentase'] <=> $a['persentase'];
            }
        );
        return response()->json([
            'status' => true,
            'data' => $result
        ]);
    }