Fix statistics calculation for imported Likert scale responses and support text rating answers

This commit is contained in:
pongpon pitisuk
2026-09-12 16:11:27 +07:00
parent fb5b4b4c95
commit a68bddb5c0
4 changed files with 217 additions and 39 deletions
+43 -5
View File
@@ -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();
}