0 votes
in SoSci Survey (dt.) by s181751 (110 points)
edited by s181751

Hallo,

ich habe ein paar Probleme bei der implementation eines Punktezählers. Zu meinem Experiment: Die Versuchspersonen sollen ein Quiz mit 18 Fragen beantworten, wovon 14 single choice Aufgaben darstellen (QE01-QE11, QE15-QE17) und 4 offene Aufgaben sind (CX01-CX04). Die Fragen sollen in 3 Blöcken mit jeweils 6 Fragen präsentiert werden, vor denen in jedem Block jeweils eine von 3 Instruktionen kommt (also hat man am Ende des Experiments alle 3 Instruktionen gesehen, die die Stufen des within-Faktors Anreiz darstellen). Die Reihenfolge der Instruktionen sind randomisiert und auch die Fragen sind über die Blöcke hinweg randomisiert. Dies habe ich gelöst, indem ich jede Frage auf eine Seite platziert habe und die Seiten so randomisiert habe, dass immer eine Instruktionsseite und dann 6 Fragen-Seiten präsentiert werden. Außerdem gibt es im Rahmen einer Between-Bedingung 2 "sets" von Instruktionen Nun würde ich gerne den Probanden nach jedem Block mitteilen, wie viele der 6 Fragen dieses Blocks richtig beantwortet wurden. Ich habe es mit der "Punkte für Antworten Zählen"-Seite geschafft, die Punkte für alle Fragen am Ende zu zählen, wenn ich den Code allerdings an das Ende eines Blockes stelle, dann bekomme ich Fehlermeldungen, da die Antwort der noch nicht beantworteten Fragen noch nicht vorliegt. Das Hauptproblem ist dabei, dass ich erst ermitteln muss, welche Fragen in welchem Block gezeigt wurden und dann müssen entsprechend der Seiten die Fragen bepunktet werden. Wie kann ich also nach jeweils 6 randomisierten Fragen einen Punktestand für genau diese Fragen berichten?

Hier ein Code Beispiel für die Randomisierung der Seiten und Instruktionen, wobei RM01 die Between-Bedingung (Individual vs Competition) zuteilt, RM03 die Abfolge der Instruktionen in set 1, RM04 die Abfolge der Instruktionen in set 2 und RM06 die Seitenabfolge und somit die Abfolge der Fragen:

// Instruktionen für Individual
if (value('RM01') == 1) {

// RM03 wird gezogen
show('RM03');


// Zufällige 1. Darbietung der Stufen des Faktors Anreiz
$withinindv1 = valueList('RM03', [1], 'label');
foreach ($withinindv1 as $kennung) {
  text($kennung);

}
}

//Instruktionen für Competition
elseif (value('RM01') == 2) {

// RM04 wird gezogen
show('RM04');


// Zufällige 1. Darbietung der Stufen des Faktors Anreiz
$withincomp1 = valueList('RM04', [1], 'label');
foreach ($withincomp1 as $kennung) {
  text($kennung);


}
}

question('RM06');  // Zettel in zufälliger Reihenfolge ziehen
$pages = valueList('RM06', [1, 2, 3, 4, 5, 6], 'label');  // Gezogene Zettel auslesen
setPageOrder($pages, 'INS02');  // Seiten als Seitenabfolge definieren

-> Ähnliche Codes habe ich noch 2 weitere Male, in denen bei $pages die restlichen Seiten angezeigt werden und die anderen Instruktionen dargeboten werden.

Nun hier die aktuelle Punktezähler-Seite, die ich gerne so abändern würde, dass ich nach einem Block die Rückmeldung für die Punktzahl in genau diesem Block rückmelde:

// Definition der Fragen und der korrekten Antworten
$fragen = [
  'QE01' => 3,  
  'QE02' => 2,  
  'QE03' => 1, 
  'QE04' => 2,
  'QE05' => 2,
  'QE06' => 3,
  'QE07' => 2,
  'QE08' => 1,
  'QE09' => 2,
  'QE10' => 5,
  'QE11' => 4,
  'QE15' => 1,
  'QE16' => 2,
  'QE17' => 4,
  'CX01_01' => "5",
  'CX02_01' => "47",
  'CX03_01' => "4",
  'CX04_01' => "29"
];
 
// Initialisierung einer Zähler-Variable
$points1 = 0;
 
// Prüfung aller Fragen in einer Schleife
foreach ($fragen as $variable=>$correct) {
  // Die Antwort des Teilnehmers abrufen
  $answer = value($variable);
  // Überprüfen und ggf. einen Punkt zählen
  if ($answer == $correct) {
    $points1++;  // Gleichbedeutend mit $points = $points + 1
  }
}
// Das Ergebnis anzeigen ...
html('<p>You have now completed the quiz questions. Overall, you have answered '.$points1.' questions correctly. Please proceed by clicking the next button.</p>'); 

Ich hoffe die Darstellung der Studie und des Problems war verständlich. Ich freue mich über eine Antwort und Danke für Ihre Hilfe!

1 Answer

0 votes
by SoSci Survey (302k points)

Sie schreiben, dass Sie die Seiten randomisiert darbieten. Aber Die haben ja zwei Ebenen: Seiten und Blöcke. Verstehe ich es korrekt, dass Sie alle 18 Fragen=Seiten komplett durchmischen (RM06) und dann einfach der (gemischten) Reihenfolge nach präsentieren, ja?

Meines Erachtens wäre es einfacher, wenn Sie in den Zufalsgenerator die Frage-Kennungen legen statt der Seiten-Kennungen und dann nur eine Seite mittels loopPage() 6-mal wiederholen. Das hätte den Vorteil, dass Sie aus dem Zufallsgenerator auch gleich die Frage-Kennungen für die Seiten auslesen könnten.

Alternativ können Sie natürlich den Seiten dieselben Kennungen geben wie den Fragen (besser in dem Fall: Variablen), oder Sie definieren in einem Array, welche Frage bzw. welche Variable zu jeder Seite gehört.

Langer Rede kurzer Sinn: Die passenden Variablen können Sie aus dem Zufallsgenerator auslesen. Direkt oder indirekt. Wenn Sie also ein Array haben, welche Variablen auf den letzten 6 Seiten abgefragt wurden, müssen Sie nach dem

foreach ($fragen as $variable=>$correct) {

Nur noch Variablen überspringen, wenn diese nicht in der Liste stehen.

  if (!in_array($variable, $last6)) {
    continue;
  }
by s181751 (110 points)
Vielen Dank für die Hilfe!

Leider muss ich die Lösung über die randomisierten Seiten beibehalten, da ich einen Klickzähler für jede Seite habe. Die Anzahl der Klicks muss also für jede Seite einzeln gespeichert werden.

Ich habe jedoch nun erhebliche Probleme, ein Array zu implementieren, welches die Fragen der letzten 6 Seiten abfragt. Ich bin leider noch Anfängerin im Programmieren und tue mich bei so etwas etwas schwer.

Ich würde mich freuen, wenn Sie mir noch einmal helfen könnten!
by SoSci Survey (302k points)
> Ich habe jedoch nun erhebliche Probleme, ein Array zu implementieren, welches die Fragen der letzten 6 Seiten abfragt.

Kein Problem, da arbeiten wir uns Schritt für Schritt heran. Starten wir mal mit folgender Zeile aus Ihrem PHP-Code oben:

$pages = valueList('RM06', [1, 2, 3, 4, 5, 6], 'label');

Und hier noch ein Beispiel-Code, wie Sie Codes von A-F in die Codes G-L umkodieren - also in ein Array:

$kodierung = [
  'A' => 'G',
  'B' => 'H',
  // ...
  'F' => 'L'
];
$fragen = [];
foreach ($pages as $page) {
  $fragen[] = $kodierung[$page];
}

Was Sie jetzt nur noch machen müssen ist, dass Sie von Seitenkennungen auf Variablen umkodieren.
by s181751 (110 points)
Vielen Dank, der Online-Support ist wirklich klasse!

Allerdings funktioniert es bei mir immer noch nicht. Ich war etwas verwirrt was ich in die beiden eckigen Klammern hinter $fragen eingeben muss (wie erwähnt bin ich eine Anfängerin und dies ist mein erster Code). Nach einigem Trial und Error bin ich immer noch nicht auf eine Lösung gekommen. In die eckigen Klammern beim ersten $fragen habe ich, wie in dem Beispiel-Code auf der Hilfe-Seite zum Punktezählen die richtigen Antworten definiert. Weder Zahlen noch die Fragenkennungen in den eckigen Klammern beim zweiten $fragen scheinen zu funktionieren. Auch wenn die Klammern frei bleiben bekomme ich eine Fehler-Meldung.

Aktuell sieht mein Code für den Punktezähler nach den ersten 6 Fragen so aus (QU sind die Seitenkennungen der Frageseiten):

$pages = valueList('RM06', [1, 2, 3, 4, 5, 6], 'label');
$kodierung = [
  'QU01' => 'QE01',  
  'QU02' => 'QE02',  
  'QU03' => 'QE03',  
  'QU04' => 'QE04',
  'QU05' => 'QE05',
  'QU06' => 'QE06',
  'QU07' => 'QE07',
  'QU08' => 'QE08',
  'QU09' => 'QE09',
  'QU10' => 'QE10',
  'QU11' => 'QE11',
  'QU12' => 'QE15',
  'QU13' => 'QE16',
  'QU14' => 'QE17',
  'QU15' => 'CX01_01',
  'QU16' => 'CX02_01',
  'QU17' => 'CX03_01',
  'QU18' => 'CX04_01',
];
$fragen =  ['QE01' => 3,  //Zuweisung der richtigen Antworten zu den Fragen
  'QE02' => 2,  
  'QE03' => 1,  
  'QE04' => 2,
  'QE05' => 2,
  'QE06' => 3,
  'QE07' => 2,
  'QE08' => 1,
  'QE09' => 2,
  'QE10' => 5,
  'QE11' => 4,
  'QE15' => 1,
  'QE16' => 2,
  'QE17' => 4,
  'CX01_01' => "5",
  'CX02_01' => "47",
  'CX03_01' => "4",
  'CX04_01' => "29"];
foreach ($pages as $page) {
  $fragen [] = $kodierung[$page];
}
// Initialisierung einer Zähler-Variable
$points1 = 0;
 
// Prüfung aller Fragen in einer Schleife
foreach ($fragen as $variable=>$correct) {
  // Die Antwort des Teilnehmers abrufen
 if (!in_array($variable, $last6)) {
    continue;
  }
  $answer = value($variable);
  // Überprüfen und ggf. einen Punkt zählen
  if ($answer == $correct) {
    $points1++;  // Gleichbedeutend mit $points = $points + 1
  }
}
// Das Ergebnis anzeigen ...
html('<p>Overall, you have answered '.$points1.' questions correctly. Please proceed by clicking the next button.</p>');

Was muss ich denn noch ändern, damit der Code funktioniert? Noch einmal vielen Dank für Ihre geduldige und sehr gute Hilfe!
by SoSci Survey (302k points)
Keine Sorge ... niemand muss hier über Nacht Programmieren lernen. Aber durch ein paar Basics muss man sich durchbeißen, wenn man Sonderwünsche hat :)

Eckige Klammern definieren ein Array, siehe https://www.soscisurvey.de/help/doku.php/de:create:array

$fragen = [];

Das war explizit so gedacht. Sie definieren hier ein leeres Array, das dann von der foreach-Schleife gefüllt wird. Das $fragen[] = hängt nämlich ein Element an ein Arary an.

> Auch wenn die Klammern frei bleiben bekomme ich eine Fehler-Meldung.

Fehlermeldungen bitte immer im Wortlaut posten, dann kann ich mehr dazu sagen.
by s181751 (110 points)
Ok. Vielen Dank, ich hatte es zu Beginn auch so eingefügt und so verstanden, allerdings war ich mir nach den Fehlermeldungen unsicher und habe noch etwas "herumprobiert". Hier die komplette Fehler-Meldung, wenn ich den Code so eingebe wie von Ihnen vorgeschlagen:

There is an error in the PHP code:

Questionnaire Error: Undefined index:
line: 26

PHP code

023 ];
024 $fragen =  [];
025 foreach ($pages as $page) {
026   $fragen [] = $kodierung[$page];
027 }
028
029 $points1 = 0;

Questionnaire Error: Undefined index:
line: 26

PHP code

023 ];
024 $fragen =  [];
025 foreach ($pages as $page) {
026   $fragen [] = $kodierung[$page];
027 }
028
029 $points1 = 0;

Questionnaire Error: Undefined index:
line: 26

PHP code

023 ];
024 $fragen =  [];
025 foreach ($pages as $page) {
026   $fragen [] = $kodierung[$page];
027 }
028
029 $points1 = 0;

Questionnaire Error: Undefined index:
line: 26

PHP code

023 ];
024 $fragen =  [];
025 foreach ($pages as $page) {
026   $fragen [] = $kodierung[$page];
027 }
028
029 $points1 = 0;

Questionnaire Error: Undefined index:
line: 26

PHP code

023 ];
024 $fragen =  [];
025 foreach ($pages as $page) {
026   $fragen [] = $kodierung[$page];
027 }
028
029 $points1 = 0;

Questionnaire Error: Undefined index:
line: 26

PHP code

023 ];
024 $fragen =  [];
025 foreach ($pages as $page) {
026   $fragen [] = $kodierung[$page];
027 }
028
029 $points1 = 0;

Questionnaire Error: The PHP variable $last6 has been used but the variable is yet undefined (the variable has no value).

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: in_array() expects parameter 2 to be array, null given
line: 34

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: The PHP variable $last6 has been used but the variable is yet undefined (the variable has no value).

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: in_array() expects parameter 2 to be array, null given
line: 34

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: The PHP variable $last6 has been used but the variable is yet undefined (the variable has no value).

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: in_array() expects parameter 2 to be array, null given
line: 34

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: The PHP variable $last6 has been used but the variable is yet undefined (the variable has no value).

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: in_array() expects parameter 2 to be array, null given
line: 34

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: The PHP variable $last6 has been used but the variable is yet undefined (the variable has no value).

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: in_array() expects parameter 2 to be array, null given
line: 34

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: The PHP variable $last6 has been used but the variable is yet undefined (the variable has no value).

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Questionnaire Error: in_array() expects parameter 2 to be array, null given
line: 34

PHP code

031
032 foreach ($fragen as $variable=>$correct) {
033   
034  if (!in_array($variable, $last6)) {
035     continue;
036   }
037   $answer = value($variable);

Dass ich $last6 noch definieren muss verstehe ich, die oberen Fehler sind mir allerdings ein Rätsel.
by SoSci Survey (302k points)
> Questionnaire Error: Undefined index:
> line: 26
>
> PHP code
>
> 026   $fragen [] = $kodierung[$page];

Damit will PHP sagen, dass es in dem Array $kodierungen keinen Eintrag mit dem Schlüssel $page findet. Um den Fehler einzugrenzen, müssen wir also klären, was in $page steht. Tragen Sie dafür über dieser Zeile ein:

debug($page);
$fragen [] = $kodierung[$page];

Und am besten zu Beginn auch gleich noch folgendes:

$pages = valueList('RM06', [1, 2, 3, 4, 5, 6], 'label');
debug($pages);

Mit dem, was dann an Zusatzinfos erscheint, sollten wir weiterkommen.
by s181751 (110 points)
Guten Tag,

wenn ich das eingebe erscheint zusätzlich folgende Information:

Debug information for $pages:
RM06x01, RM06x02, RM06x03, RM06x04, RM06x05, RM06x06

Debug information for $page:
$page = (string)
by SoSci Survey (302k points)
Sind Sie sicher, dass die Frage RM06 beim Testen ausgeführt wurde ... dass der Test als spätestens auf der Seite gestartet ist, wo RM06 platziert wurde? Es scheint so, dass vom Zufallsgenerator in dem Test noch keine Seiten gezogen wurden.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...