1 балл за все чекбоскы (тест на php)

djdiplomat
На сайте с 05.08.2009
Offline
136
825

Вроде просто, но прошу помощи.

Пишу скрипт тестов. И там есть такая штука.

<label>Вопрос</label>

<input class="tas" name="'.$key.'" type="checkbox" value="1">
<input class="tas" name="'.$key.'" type="checkbox" value="0">
<input class="tas" name="'.$key.'" type="checkbox" value="1">
<input class="tas" name="'.$key.'" type="checkbox" value="1">
<input class="tas" name="'.$key.'" type="checkbox" value="0">

Так вот. За такие вопросы нужно начислять 1 балл в случае, если человек отметил флажки1, 3, 4 и 0 баллов в любом другом случае.

Как такое лучше реализовать?

На данном этапе подсчет баллов ведется так:

$polya_formy = $_REQUEST['data']; //считываем все ответы

$itog=0;
for ($n=0; $n < count($polya_formy); $n++) {
$current_array = $polya_formy[$n];
$keys = array_keys($current_array); // получаем ключи ассоциативного массива
$current_name = $current_array[$keys[0]]; // имя текущего поля
$current_value = $current_array[$keys[1]]; // значение поля

$itog = $itog + $current_value; // вычисляем итоговое количество баллов
}

Но очевидно, в таком случае у меня за подобный вопрос на выходе 3 балла (сумма чекбоксов). А нужно, чтобы был 1.

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#1

Так вы сами же суммируете: $itog = $itog + $current_value;

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
djdiplomat
На сайте с 05.08.2009
Offline
136
#2
LEOnidUKG:
Так вы сами же суммируете: $itog = $itog + $current_value;

Нет смотрите. там какая штука.

В одном тесте комбинированные вопросы.

Т.е. есть где радио кнопки.

<label>Вопрос 1</label>

<input class="tas" name="'.$key.'" type="radio" value="3">

<input class="tas" name="'.$key.'" type="checkbox" value="5">

<input class="tas" name="'.$key.'" type="radio" value="15">

Есть где чекбоксы

<label>Вопрос 2</label>

<input class="tas" name="'.$key.'" type="checkbox" value="1">

<input class="tas" name="'.$key.'" type="checkbox" value="5">

<input class="tas" name="'.$key.'" type="checkbox" value="8">

А есть это вопрос

<label>Вопрос3</label>

<input class="tas" name="'.$key.'" type="checkbox" value="1">

<input class="tas" name="'.$key.'" type="checkbox" value="0">

<input class="tas" name="'.$key.'" type="checkbox" value="1">

<input class="tas" name="'.$key.'" type="checkbox" value="1">

<input class="tas" name="'.$key.'" type="checkbox" value="0">

Переменная итог $itog = это сумма набранных за каждый вопрос баллов. Т.е. за вопрос 1 человек может получить максимум 15, за вопрос 2. от 1 до 14 (1+5+8) баллов тк может отметить сраз все чекбоксы и тест это позволяет. , а за вопрос три он должен получать либо 1, либо 0.

Вот как это блин расшаривать я не придумал еще....

PS сам массив отмеченных чекбоксов и радио у меня передается через аякс var data = $(this).serializeArray();

и храниться тут $_REQUEST['data'];

Перменная $key = равна номеру вопроса.

Т.е.

<label>Вопрос 1</label>

<input class="tas" name="1" type="radio" value="3">

<input class="tas" name="1" type="checkbox" value="5">

<input class="tas" name="1" type="radio" value="15">

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#3

Ну так вам нужно для для таких вопросов отдельное имя заводить name="key2"

Скрипт же мысли читать не умеет.

S
На сайте с 13.10.2014
Offline
171
#4

Я-бы все делал через двоичную сс

как пример


$z = array (0,0,0,1,1,0,1,1,0,0,0,1);
$v = false;
$d = '';
foreach ($z as $value){
$d .= $value;
}
if (bindec($d) == 433) {
$v = true;
}

print var_dump($v) ;

ректальненько, но по-крайней мере работает

djdiplomat
На сайте с 05.08.2009
Offline
136
#5
LEOnidUKG:
Ну так вам нужно для для таких вопросов отдельное имя заводить name="key2"
Скрипт же мысли читать не умеет.

Примерно начинаю понимать ход ваших мыслей.

А вот вопрос.

name="key2" или name="key2[]" лучше?

просто вопрос такого типа в тесте может быть произвольное число.

до конца один фиг не придумал, как все же делать проверку по самому вопросу.

Т.е. проверить, что заполнены именно эти 3 чекбоска, а не какие-то другие....

можете чуть более развернуто совет дать?

LEOnidUKG
На сайте с 25.11.2006
Offline
1755
#6

Ну придумайте как в группу такие вопросы то собрать. И оттуда уже надо исходить.

Просто у вас будет два подсчёта, один общий, а другой для другой группы вопросов. И там уже будет другая логика подсчёта. Кстати НЕ выделенные чекбоксы вообще не передаются.

А вот с 0 у вас могут быть проблемы при проверки. Поэтому для этой группы я рекомендую сделать 1 и 2 в value, чтобы можно было проверить выделен нужный ли или нет.

S
На сайте с 13.10.2014
Offline
171
#7

система такая берете

Name

называете его вроде name = "field[fieldType][fieldId]"

далее прогоняете через умную функцию, разделяющую обработчики в зависимости от fieldType

Профит

djdiplomat
На сайте с 05.08.2009
Offline
136
#8

Понял. Спасибо! И еще вопрос в догонку. По схожей теме.

А тесты типа "Больше ответов А" Или больше ответов "С"

Где фиксированное число вариантов ответов.

Их лучше как сделать?

<label>Вопрос 1</label>

<input class="tas" name="a[]'" type="checkbox" value="A">

<input class="tas" name="b[]'" type="checkbox" value="B">

<input class="tas" name="c[]" type="checkbox" value="C">

<label>Вопрос 2</label>

<input class="tas" name="a[]'" type="checkbox" value="A">

<input class="tas" name="b[]'" type="checkbox" value="B">

<input class="tas" name="c[]" type="checkbox" value="C">

и потом a[], b[] и с[] загнать в count, чтобы узнать в каком массиве больше ответов. Или есть другой вариант, более разумный?

Особенно учитывая, что все через .serializeArray() сперва проходит

S
На сайте с 13.10.2014
Offline
171
#9

может так

$z = array('a'=> 0, 'b'=> 0, 'c' => 0,);
$d = array('a','c','a','b','b','c','a');
foreach($d as $value){
$z[$value] = $z[$value]+1;
}
arsort($z);
print_r(array_shift ($z));

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий