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); }