Fix statistics calculation for imported Likert scale responses and support text rating answers
This commit is contained in:
+43
-5
@@ -45,6 +45,41 @@ switch ($action) {
|
||||
jsonResponse(['error' => 'Invalid action'], 400);
|
||||
}
|
||||
|
||||
function parseRatingScore($str) {
|
||||
$trimmed = trim((string)$str);
|
||||
if ($trimmed === '') return null;
|
||||
|
||||
if (is_numeric($trimmed)) {
|
||||
$num = (int)$trimmed;
|
||||
return ($num >= 1 && $num <= 5) ? $num : null;
|
||||
}
|
||||
|
||||
if (preg_match('/^([1-5])\s*[\.\:\-\(\s]/u', $trimmed, $m)) {
|
||||
return (int)$m[1];
|
||||
}
|
||||
|
||||
if (mb_strpos($trimmed, 'มากที่สุด') !== false || mb_strpos($trimmed, 'ดีมาก') !== false || mb_strpos($trimmed, 'ยอดเยี่ยม') !== false || mb_strpos($trimmed, 'ดีเยี่ยม') !== false || mb_strpos($trimmed, 'เห็นด้วยอย่างยิ่ง') !== false) {
|
||||
return 5;
|
||||
}
|
||||
if (mb_strpos($trimmed, 'น้อยที่สุด') !== false || mb_strpos($trimmed, 'ไม่เห็นด้วยอย่างยิ่ง') !== false) {
|
||||
return 1;
|
||||
}
|
||||
if (mb_strpos($trimmed, 'มาก') !== false || mb_strpos($trimmed, 'ดี') !== false || mb_strpos($trimmed, 'เห็นด้วย') !== false) {
|
||||
return 4;
|
||||
}
|
||||
if (mb_strpos($trimmed, 'ปานกลาง') !== false || mb_strpos($trimmed, 'พอใช้') !== false || mb_strpos($trimmed, 'ไม่แน่ใจ') !== false) {
|
||||
return 3;
|
||||
}
|
||||
if (mb_strpos($trimmed, 'น้อย') !== false || mb_strpos($trimmed, 'ควรปรับปรุง') !== false || mb_strpos($trimmed, 'ต้องปรับปรุง') !== false || mb_strpos($trimmed, 'ไม่เห็นด้วย') !== false) {
|
||||
return 2;
|
||||
}
|
||||
if (mb_strpos($trimmed, 'ปรับปรุง') !== false) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function getStatsData($surveyId) {
|
||||
$db = getDB();
|
||||
|
||||
@@ -78,7 +113,7 @@ function getStatsData($surveyId) {
|
||||
$aStmt = $db->prepare("
|
||||
SELECT answer_value, COUNT(*) as cnt
|
||||
FROM response_answers
|
||||
WHERE question_id = ? AND answer_value REGEXP '^[0-9]+$'
|
||||
WHERE question_id = ? AND answer_value != ''
|
||||
GROUP BY answer_value
|
||||
");
|
||||
$aStmt->execute([$q['id']]);
|
||||
@@ -89,10 +124,13 @@ function getStatsData($surveyId) {
|
||||
for ($i = 1; $i <= 5; $i++) $freq[$i] = 0;
|
||||
|
||||
foreach ($freqData as $fd) {
|
||||
$val = (int)$fd['answer_value'];
|
||||
$rawVal = trim($fd['answer_value']);
|
||||
$cnt = (int)$fd['cnt'];
|
||||
$val = parseRatingScore($rawVal);
|
||||
|
||||
if ($val >= 1 && $val <= 5) {
|
||||
$freq[$val] = (int)$fd['cnt'];
|
||||
for ($j = 0; $j < (int)$fd['cnt']; $j++) $values[] = $val;
|
||||
$freq[$val] += $cnt;
|
||||
for ($j = 0; $j < $cnt; $j++) $values[] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +154,7 @@ function getStatsData($surveyId) {
|
||||
else $q['interpretation'] = 'น้อยที่สุด';
|
||||
|
||||
} elseif (in_array($q['question_type'], ['dropdown', 'checkbox', 'radio'])) {
|
||||
$aStmt = $db->prepare("SELECT answer_value, COUNT(*) as cnt FROM response_answers WHERE question_id = ? GROUP BY answer_value ORDER BY cnt DESC");
|
||||
$aStmt = $db->prepare("SELECT answer_value, COUNT(*) as cnt FROM response_answers WHERE question_id = ? AND answer_value != '' GROUP BY answer_value ORDER BY cnt DESC");
|
||||
$aStmt->execute([$q['id']]);
|
||||
$q['frequencies'] = $aStmt->fetchAll();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user