private function checkIfRuleExists($symptomsArray)
 {
     $rules = Rule::with('symptom')->whereIn('symptom_id', $symptomsArray)->get()->groupBy('number');
     list($rulesKeys) = array_divide($rules->toArray());
     $rules = Rule::with('symptom')->whereIn('number', $rulesKeys)->get()->groupBy('number');
     $rules = $rules->map(function ($symptoms, $key) {
         return $symptoms->groupBy('symptom_id');
     });
     $rules = $rules->filter(function ($rule) use($symptomsArray) {
         list($symptomKeys) = array_divide($rule->toArray());
         $intersect = array_intersect($symptomsArray, $symptomKeys);
         if ($rule->count() >= count($symptomsArray) && $intersect == $symptomsArray) {
             return true;
         }
     });
     $maxSymptomKey = 0;
     foreach ($rules as $key => $ruleNumber) {
         list($symptomKeys) = array_divide($ruleNumber->toArray());
         $difference = array_diff($symptomKeys, $symptomsArray);
         if (empty($difference)) {
             return true;
         } elseif ($symptomKeys == $difference) {
             return false;
         }
     }
 }
 public function analyze(Request $request)
 {
     if ($request->isMethod('post')) {
         $this->validate($request, ['sintoma' => 'required'], ['sintoma.required' => 'Debe seleccionar un síntoma para continuar']);
         if ($request->session()->has('session_sintomas')) {
             // Acá busca si el elemento no está en el array de session, para agregarlo
             $sessionSymptoms = $request->session()->get('session_sintomas');
             if (!in_array($request->sintoma, $sessionSymptoms)) {
                 $sessionSymptoms[] = $request->sintoma;
                 $request->session()->put(['session_sintomas' => $sessionSymptoms]);
             }
         } else {
             $request->session()->put(['session_sintomas' => [$request->sintoma]]);
         }
     }
     $sessionSymptoms = $request->session()->get('session_sintomas');
     // Buscamos en la tabla de reglas con los síntomas obtenidos de la sesión primero buscando
     // por síntomas  y después buscando por número de regla
     $rules = Rule::with('symptom')->whereIn('symptom_id', $sessionSymptoms)->get()->groupBy('number');
     //dd($rules, $sessionSymptoms);
     list($rulesKeys) = array_divide($rules->toArray());
     // Después buscamos en la tabla de reglas en base a número de su regla
     // obtenido en la anterior operación
     $rules = Rule::with('symptom')->whereIn('number', $rulesKeys)->get()->groupBy('number');
     //Agrupamos los interiores de las reglas en base al número de su síntoma
     $rules = $rules->map(function ($symptoms, $key) {
         return $symptoms->groupBy('symptom_id');
     });
     // Filtramos solo las reglas que contengan un número de síntomas igual a
     // los de la sesión o mayores y que los síntomas de la sesión estén
     // contenidos en cada una de las reglas.
     // Ej: [1,7,9] >= [1, 9] && [1,9] = [1,9]
     $rules = $rules->filter(function ($rule) use($sessionSymptoms) {
         list($symptomKeys) = array_divide($rule->toArray());
         $intersect = array_intersect($sessionSymptoms, $symptomKeys);
         if ($rule->count() >= count($sessionSymptoms) && $intersect == $sessionSymptoms) {
             return true;
         }
     });
     //dd($rules, $sessionSymptoms);
     $symptomsForSelect = [];
     $diagnosticId = 0;
     $maxSymptomKey = 0;
     //dd($rules);
     foreach ($rules as $key => $ruleNumber) {
         list($symptomKeys) = array_divide($ruleNumber->toArray());
         $difference = array_diff($symptomKeys, $sessionSymptoms);
         // Contamos el arreglo de sintomas para saber cual es el que tendrá
         // más elementos y lo asignamos a la variable maxSymptomKey
         if (count($symptomKeys) > $maxSymptomKey) {
             $maxSymptomKey = count($symptomKeys);
         }
         //dd($difference, $symptomKeys);
         // Si esta vacío significa que no hay diferencias
         if (empty($difference)) {
             // tomamos el primer elemento del primer elemento de la coleccion
             // (está ordenado por id_sintoma)
             $diseaseKey = $ruleNumber->first()->first()->disease_id;
             $diagnosticId = $this->generateDiagnostic($diseaseKey, $request->user()->id);
             $request->session()->forget('session_sintomas');
             return redirect()->route('user::diagnosticos::show', $this->encode($diagnosticId));
         } elseif ($symptomKeys == $difference) {
             alert('No se encontró ninguna enfermedad con los síntomas brindados, intente de nuevo', 'danger');
             return redirect()->route('user::diagnosticos::create');
         } else {
             $tempSymptoms = Symptom::findOrFail($difference);
             foreach ($tempSymptoms as $tempSymptom) {
                 $symptomsForSelect[$tempSymptom->id] = $tempSymptom->name;
             }
         }
     }
     // Si se acabaron los síntomas o si los síntomas en sesión son mayores
     // al mayor arreglo por regla entonces es porque la enfermedad es
     // indetectable con los síntomas ingresados.
     // Ej: Máxima Regla = [1, 3, 9, 10]
     // Ej: Síntoma en sesión = [1, 3, 4, 5, 9, 10, 13]
     $numberSessionSymtoms = count($request->session()->get('session_sintomas'));
     if (empty($symptomsForSelect) || $numberSessionSymtoms > $maxSymptomKey) {
         alert('No se encontró ninguna enfermedad con los síntomas brindados, intente de nuevo', 'danger');
         return redirect()->route('user::diagnosticos::create');
     }
     // Listar los síntomas escogidos
     $tempSymptoms = Symptom::findOrFail($request->session()->get('session_sintomas'));
     foreach ($tempSymptoms as $tempSymptom) {
         $showSymptoms[$tempSymptom->id] = $tempSymptom->name;
     }
     return view('user.diagnostic.create')->with('showSymptoms', $showSymptoms)->with('sintomas', $symptomsForSelect);
 }