/** * SPM */ protected static function calSPM(&$resultsets) { #首先判断是否需要写入SPM相关的因子分数 if (empty(self::$factors_list_all)) { self::getFactorsAll($resultsets->examinee_id); } if (!isset(self::$factors_list_all['SPM'])) { #true 表示不用写入SPM的相关因子 return true; } #确保加载内存表 if (!self::$memory_state) { self::loadMemoryTable(); } #确保个人信息 if (empty(self::$examinee_info)) { self::getExamineeInfo($resultsets->examinee_id); } #整理SPM题目答案 $question_ans_array = self::getAnswers($resultsets); #确定所有涉及的因子,不再进行全局遍历 $array_all_use = array(); foreach (self::$factors_list_all['SPM'] as $key => $value) { $factor_detail = MemoryCache::getFactorDetail($value); if ($factor_detail->action == 'sum') { if (!in_array($value, $array_all_use)) { $array_all_use[$key] = $value; } } else { if (!in_array($value, $array_all_use)) { $array_all_use[$key] = $value; } $child_factor_str = $factor_detail->children; $child_factor_array = explode(',', $child_factor_str); foreach ($child_factor_array as $fvalue) { if (!in_array($fvalue, $array_all_use)) { $fvalue_tmp = MemoryCache::getFactorDetail($fvalue); $fkey = $fvalue_tmp->id; $array_all_use[$fkey] = $fvalue; } } } } ksort($array_all_use); #得到一个完全有效数组 #返回数组 $rt_array = array(); #保存基础数组 $basic_array = array(); #简单因子先处理,复杂因子后处理,由于复杂因子使用简单因子的原始分,那么我们次序对其进行运算 foreach ($array_all_use as $key => $value) { $factor_record = MemoryCache::getFactorDetail($value); $score = 0; if ($factor_record->action == 'sum') { #前5项(至多) 简单因子的原始得分 $factor_record_number_array = explode(',', $factor_record->children); foreach ($factor_record_number_array as $skey) { if (isset($question_ans_array[$skey])) { $score += $question_ans_array[$skey]; } } $basic_array[$value] = $score; } else { #至多2项 $code = preg_replace('/[a-z]+/', '\\$basic_array[\'$0\']', $factor_record->action); $code = "\$score = {$code};"; eval($code); $basic_array[$value] = $score; } } #basic_array >= $factor_list_all['SPM']; foreach ($basic_array as $key => $value) { if (!in_array($key, self::$factors_list_all['SPM'])) { unset($basic_array[$key]); } } #现在的$basic_array为有效数组的原始的分 $age = self::$examinee_info['age']; #spm的年龄区间 5.25~110 if ($age < 5.25 || $age >= 110) { throw new Exception(self::$error_state . "SPM年龄范围越界" . $age); } foreach ($basic_array as $key => $score) { $factor_record = MemoryCache::getFactorDetail($key); $array_record = array(); $std_score = 0; $ans_score = 0; if ($key == 'spm') { $spmmd = SpmmdMemory::findFirst(array('NLH >= :age: AND NLL <= :age:', 'bind' => array('age' => $age))); if (!isset($spmmd->NLH)) { throw new Exception(self::$error_state . '-Spmmd不存在记录-' . 'age-' . $age); } if ($score >= $spmmd->B95) { $std_score = 195; } else { if ($score >= $spmmd->B90) { $std_score = 290; } else { if ($score >= $spmmd->B75) { $std_score = 275; } else { if ($score >= $spmmd->B50) { $std_score = 350; } else { if ($score >= $spmmd->B25) { $std_score = 325; } else { if ($score >= $spmmd->B10) { $std_score = 410; } else { if ($score >= $spmmd->B5) { $std_score = 45; } else { $std_score = 51; } } } } } } } // std_score 第一位 智力等级 之后位为 百分等级 $flag = substr($std_score, 0, 1); if ($flag == 1) { $ans_score = 9; } else { if ($flag == 2) { $ans_score = 7.5; } else { if ($flag == 3) { $ans_score = 6; } else { if ($flag == 4) { $ans_score = 5; } else { if ($flag == 5) { $ans_score = 4; } else { $ans_score = 1; } } } } } } else { $std_score = $score; if ($key == 'spmabc') { $ans_score = sprintf("%.2f", $std_score / 3.6); } else { $ans_score = sprintf("%.2f", $std_score / 1.2); } } $array_record['score'] = floatval($score); $array_record['std_score'] = floatval($std_score); $array_record['ans_score'] = floatval($ans_score); $rt_array[$factor_record->id] = $array_record; } return $rt_array; }
/** * @usage 获取所有涉及到的因子得分数组 * @param int $examinee_id */ private static function getFactors($examinee_id) { $factors_ans = FactorAns::find(array("examinee_id = :examinee_id:", 'bind' => array('examinee_id' => $examinee_id))); if (count($factors_ans) == 0) { throw new Exception(self::$error_state . '-下层因子成绩未写入-' . count($factors_ans)); } if (empty(self::$project_id)) { self::getProjectId($examinee_id); } $project_detail = MemoryCache::getProjectDetail(self::$project_id); $factor_needed = json_decode($project_detail->factor_names, true); foreach ($factor_needed as $key => $value) { if (is_scalar($value)) { $factor_detail = MemoryCache::getFactorDetail($value); $factor_id = $factor_detail->id; $factor_ans = FactorAns::findFirst(array("examinee_id = :examinee_id: AND factor_id = :factor_id:", 'bind' => array('examinee_id' => $examinee_id, 'factor_id' => $factor_id))); if (!isset($factor_ans->examinee_id)) { throw new Exception(self::$error_state . '-因子计分未写入-name-' . $value . '-id-' . $factor_id); } self::$factors_list[$value] = $factor_ans->ans_score; } else { foreach ($value as $skey => $svalue) { $factor_detail = MemoryCache::getFactorDetail($svalue); $factor_id = $factor_detail->id; $factor_ans = FactorAns::findFirst(array("examinee_id = :examinee_id: AND factor_id = :factor_id:", 'bind' => array('examinee_id' => $examinee_id, 'factor_id' => $factor_id))); if (!isset($factor_ans->examinee_id)) { throw new Exception(self::$error_state . '-因子计分未写入-name-' . $svalue . '-id-' . $factor_id); } self::$factors_list[$svalue] = $factor_ans->ans_score; } } } if (isset($factor_needed)) { unset($factor_needed); } }