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

Ich habe insgesamt 15 Frageblöcke erstellt, die zufällig rotieren sollen. Innerhalb des Blocks muss die Reihenfolge der Fragen aber beibehalten werden.

if (!isset($blocks)) {
  // Liste der Seiten definieren
  $blocks = array('KG1Start-KG1End','KG2Start-KG2End','KG3Start-KG3End','KG4Start-KG4End', 'KW1Start-KW1End', 'KW2Start-KW2End', 'KW3Start-KW3End', 'KW4Start-KW4End', 'KW5Start-KW5End', 'KW6Start-KW6End', 'DI1Start-DI1End', 'DI2Start-DI2End', 'DI3Start-DI3End', 'DI4Start-DI4End', 'DI5Start-DI5End');
  // Liste mischen
  shuffle($blocks);
  // Die Seite ergänzen, wo es nachher weiter geht
  $blocks[] = 'SD';
  // Reihenfolge zwischenspeichern, um spätere Änderung zu vermeiden
  registerVariable($blocks);
}
setPageOrder($blocks);

Nun versuche ich verzweifelt, einen Code mit put() zu schreiben, um die Reihenfolge der präsentierten Blöcke abzuspeichern. Das gelingt mir aber nicht und ich habe schon die unterschiedlichsten Szenarien durchprobiert.

Ich habe schon mal eine interne Variable erstellt. Es scheitert jedoch schon daran, dass ich nicht sicher bin, was deren Kennung überhaupt ist. Und, muss ich nun 15 Variablen anlegen?

1 Answer

0 votes
by SoSci Survey (304k points)

Nun versuche ich verzweifelt, einen Code mit put() zu schreiben, um die Reihenfolge der präsentierten Blöcke abzuspeichern.

Sie posten leider nicht, was Sie schon versucht haben. Deshalb würde ich einfach mal mit dem Beispiel-Code aus der Anleitung zu put() anfangen:

for ($i=0; $i<count($blocks); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV01', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $blocks[$i]);
}

Die Kennung IV01 müssen Sie natürlich so ändern, wie Ihre interne Variablen-Frage heißt. Und diese Frage muss Ihren Blöcken entsprechend 15 Variablen (Items) haben.

by s148012 (110 points)
Danke für die schnelle Antwort. Ich habe nun Ihren Code eingegeben (siehe unten), jedoch funktioniert es nicht. Es kommt die Fehlermeldung "Beim Erstellen der Fragebogenseite ist ein Fehler aufgetreten.
Für die Funktion put() wurde anstatt einer Frage oder Item-Kennung ein Parameter vom Typ NULL angegeben."

if (!isset($blocks)) {
  // Liste der Seiten definieren
  $blocks = array('KG1Start-KG1End','KG2Start-KG2End','KG3Start-KG3End','KG4Start-KG4End', 'KW1Start-KW1End', 'KW2Start-KW2End', 'KW3Start-KW3End', 'KW4Start-KW4End', 'KW5Start-KW5End', 'KW6Start-KW6End', 'DI1Start-DI1End', 'DI2Start-DI2End', 'DI3Start-DI3End', 'DI4Start-DI4End', 'DI5Start-DI5End');
  // Liste mischen
  shuffle($blocks);
  // Die Seite ergänzen, wo es nachher weiter geht
  $blocks[] = 'SD';
  // Reihenfolge zwischenspeichern, um spätere Änderung zu vermeiden
  registerVariable($blocks);
}
setPageOrder($blocks);

for ($i=0; $i<count($blocks); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('A111', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $blocks[$i]);
}

Ich habe eine interne Variable erstellt und 15 Items gebildet. Müssen diese 15 Items noch irgendwie in den Code?
by SoSci Survey (304k points)
> Für die Funktion put() wurde anstatt einer Frage oder Item-Kennung ein Parameter vom Typ NULL angegeben.

Das spricht dafür, dass die ID für die interne Variable nicht korrekt gebildet wurde. Könnten Sie bitte einmal noch folgendes debug() ergänzen:

  $id = id('A111', $i + 1);
  debug($id);
  put($id, $blocks[$i]);

Bitte lassen Sie die Seite im Debug-Modus laufen und posten Sie, was an Debug-Information angezeigt wird.
by s148012 (110 points)
Ich habe folgenden Code eingefügt:
if (!isset($blocks)) {
  // Liste der Seiten definieren
  $blocks = array('KG1Start-KG1End','KG2Start-KG2End','KG3Start-KG3End','KG4Start-KG4End', 'KW1Start-KW1End', 'KW2Start-KW2End', 'KW3Start-KW3End', 'KW4Start-KW4End', 'KW5Start-KW5End', 'KW6Start-KW6End', 'DI1Start-DI1End', 'DI2Start-DI2End', 'DI3Start-DI3End', 'DI4Start-DI4End', 'DI5Start-DI5End');
  // Liste mischen
  shuffle($blocks);
  // Die Seite ergänzen, wo es nachher weiter geht
  $blocks[] = 'SD';
  // Reihenfolge zwischenspeichern, um spätere Änderung zu vermeiden
  registerVariable($blocks);
}
setPageOrder($blocks);

for ($i=0; $i<count($blocks); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('A111', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $blocks[$i]);
}
  $id = id('A111', $i + 1);
  debug($id);
  put($id, $blocks[$i]);

Folgende Fehlermeldungen werden im Debug-Modus angezeigt:
Für die Frage A111 wurde kein Item mit der Kennung 16 gefunden
Für die Frage A111 wurde kein Item mit der Kennung 17 gefunden
Debug-Information für $id:
Keine Daten (null)
Für die Funktion put() wurde anstatt einer Frage- oder Item-Kennung ein Parameter vom Typ NULL angegeben:
by s148012 (110 points)
Das Problem ist wahrscheinlich, dass ich die interne Variable falsch bilde und entsprechend falsch eintragen.
Muss ich zuerst eine neue Rubrik bilden und erst dann die interne Variable darin einfügen?
by SoSci Survey (304k points)
Ich meinte, dass Sie nur das debug() innerhalb der FOR-Schleife ergänzen. Aber die Debug-information hilft trotzdem weiter:

> Für die Frage A111 wurde kein Item mit der Kennung 17 gefunden

Offenbar habe ich mich bei den 15 verzählt. Bitte legen Sie noch 2 interne Variablen (Items) in der Frage A111 an.

Die drei Zeilen, die Sie zuletzt eingefügt haben, können Sie wieder entfernen.
by s148012 (110 points)
Vielen Dank, das hat nun geklappt!

Aus Interesse: Weshalb musste man da nun 17 Items und nicht lediglich 15 Items anlegen?

Gibt es auch die Möglichkeit, mit der put() Funktion Filtervariablen im Datensatz abzuspeichern? Zum Beispiel kriegen Proband*innen in meinem Datensatz einen unterschiedlichen Ablauf, abhängig davon, ob sie eine Frage "richtig" oder "falsch" beantworten. Schön wäre, dass nicht nur die Antwort gespeichert wird, sondern auch die ganze Filtervariable.
by SoSci Survey (304k points)
> Aus Interesse: Weshalb musste man da nun 17 Items und nicht lediglich 15 Items anlegen?

Wenn Sie es einmal laufen lassen, sollten die 17 Felder gefüllt sein. Der Inhalt sollte die Frage beantworten.

Ein +1 kann ich erklären: Das letzte Feld ist immer mit "SD" gefüllt.

> Gibt es auch die Möglichkeit, mit der put() Funktion Filtervariablen im Datensatz abzuspeichern?

Natürlich. Einfach im IF das put() verwenden:

if (...) {
  put('AB01_01', 1);
} else {
  put('AB01_01', 2);
}
by s148012 (110 points)
Ich habe den Code nun angewendet. Wenn Item T102 richtig ist, dann soll es im Datensatz als KG1_R abgespeichert werden, ansonsten als KG1_F. Ich habe insgesamt 15 Items. Muss ich das nun für jedes Item wiederholen? Und, setze ich den Code unter die andere put() Funktion (da, wo die Rotation gespeichert wird)?

if ((value('T102' ==1) {
  put('KG1_R', 1);
} else {
  put('KG1_F', 2);
}
by SoSci Survey (304k points)
Wenn Sie die Ergebnisse für 15 Items in 15 internen Variablen speichern möchten, wäre die Verwendung einer FOR-Schleife sinnvoll. Wie heißt denn Ihr nächstes Item? Und ... in Ihrem Beispiel fehlen zwei runde, schließende Klammern.
by s148012 (110 points)
Die nächsten Items heissen:
KG2
KG3
KG4
KW1
...usw.
by SoSci Survey (304k points)
Auf T102 folgt also KG2? Wenn nicht, dann passen Sie die Kennungen im folgenden Code bitte einfach an:

$items = [
  'T102' => 'KG1_R',
  'KG2' => 'KG2_R',
  // u.s.w.
];
foreach ($items as $item => $internal) {
  if (value($item) ==1) {
    put($internal, 1);
  } else {
    put($internal, 2);
  }
}

Was mir gerade noch aufgefallen ist: Sie haben je nach Antwort ja mit put() in unterschiedliche Variablen gespeichert. Die klassische Logik wäre, dass man unterschiedliche Codes (1/2) in dieselbe Variable speichert.
by s148012 (110 points)
Danke! Das habe ich soweit gemacht.

Wie gehe ich bei invertierten Items vor?
by SoSci Survey (304k points)
Ich kenne weder Ihre Items noch die Variablenstruktur oder Antwortcodes... wenn Sie mir mehr verraten, kann ich auch hilfreich antworten :)
by s148012 (110 points)
reshown by SoSci Survey
Ich habe 15 Items, davon sind 5 invertiert. Zurzeit wird im Datensatz jeweils gespeichert, ob jemand bei der Frage "Richtig" oder "Falsch" angekreuzt hat. Gerne möchte ich aber zusätzlich speichern, ob die ProbandInnen diese Frage auch tatsächlich richtig oder falsch hatten, ich möchte also sozusagen das Ergebnis abspeichern.
Meine Items lauten:
TO01
TP01
TQ01
TR01
TU01
TV01
TW01
TX01
TZ01
UA01

Meine invertierten Items lauten:
T102
T201
TS01
TY01
UB01

Danke!
by SoSci Survey (304k points)
Und ... was haben Sie für Antwortcodes zu den Items?

Im einfachsten Fall nehmen Sie meinen Code von oben und verwenden ihn zweimal. Einmal für die "normalen" und einmal für die invertierten Items. Dann brauchen Sie beim put() in der zweiten Kopie nur die 1 und die 2 zu tauschen.

Das ist nicht elegant, aber effektiv.
by s148012 (110 points)
1 =  richtig
2 = falsch
by SoSci Survey (304k points)
Wir sind hier inzwischen ein gutes Stück von der ursprünglichen Frage weggekommen. Weitere Nachfragen also gerne in einer neuen Frage im Support. Aber das mit dem Code sollte funktionieren, wie oben beschrieben:

$items = [
  'TO01' => 'KG1_R',
  'TP02' => 'KG2_R',
  // u.s.w.
];
foreach ($items as $item => $internal) {
  if (value($item) ==1) {
    put($internal, 1);
  } else {
    put($internal, 2);
  }
}

Und darunter die invertierten:

$items = [
  'T102' => 'KG11_R',
  'T201' => 'KG12_R',
  // u.s.w.
];
foreach ($items as $item => $internal) {
  if (value($item) == 2) {
    put($internal, 1);
  } else {
    put($internal, 2);
  }
}

Ich habe hier die 1/2 im IF getauscht, nicht im put(). Das macht einen kleinen aber feinen Unterschied bei der Behandlung fehlender Antworten.

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

...