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

0 votes

Hallo,

ich würde gerne Folgendes umsetzen:
Die Teilnehmenden bewerten ca. 120 Sätze in randomisierter Reihenfolge. Dabei wird pro Seite ein Satz präsentiert. Das läuft soweit auch (s. Code).

if (!isset($itemBlocks_A)) {
  $questions_A = ['SA01', 'SA02'];
  // Liste mit allen Items erstellen
  $items_A = [];
  foreach ($questions_A as $qstID_A) {
    $qstItems_A = getItems($qstID_A, 'all');
    foreach ($qstItems_A as $itemID_A) {
      $items_A[] = [$qstID_A, $itemID_A];
    }
  }

// Liste mischen
  shuffle($items_A);
 
// Liste speichern
  $save_A = [];
  for ($i=0; $i<count($items_A); $i++) {
  $save_A[] = $items_A[$i][0].'_'.$items_A[$i][1];
  }
  put('IV01_01', implode (',', $save_A));


// Liste aufteilen
  $itemBlocks_A = array_chunk($items_A, 1);
  registerVariable($itemBlocks_A);
}

 
// Auf mehreren Seiten präsentieren
$i = loopPage(count($itemBlocks_A));
 
// Fragetext anzeigen
question('SA01', 'spacing=0', 'show-items=no');
 
// Items anzeigen
$items_A = $itemBlocks_A[$i];
foreach ($items_A as $n => $item_A) {
    question($item_A[0], [$item_A[1]], 'spacing=0', 'show-title=no', 'show-explanation=no', 'anchor=1');
}

Nach manchen dieser Sätze würde ich nun gerne eine Kontrollfrage einbauen (eine Art „Attention-Check“). Es soll insgesamt 5 Kontrollfragen geben – diese beziehen sich immer auf einen spezifischen Satz, d.h. diese dürfen nicht mit vermischt werden, sondern müssen immer nach dem passenden Satz folgen. Zudem müssen auch die Kontrollfragen auf einer neuen Seite erscheinen.
Meine bisherige Idee basiert auf : https://www.soscisurvey.de/help/doku.php/de:create:array und https://www.soscisurvey.de/help/doku.php/de:create:rotation-complicated
Ich hatte mir überlegt, zunächst die Items, die eine Kontrollfrage haben, noch vor dem Mischen aus items_A zu nehmen.

Danach könnte man 5 Arrays bilden, die jeweils aus dem Satz und der dazugehörenden Kontrollfrage bestehen. Schließlich müssten man dann den array items_A und die arrays mit den Sätzen + Kontrollfragen mischen.

Leider kommt nach dem ersten Schritt schon eine Fehlermeldung:

$mitK = ['SA01_01'];
$items = array_diff($items_A, $mitK);

Zudem bin ich mir unsicher, ob das der richtige Ansatz ist.
Schon jetzt vielen Dank für die Hilfe!

in SoSci Survey (dt.) by s169543 (185 points)
edited by s169543

1 Answer

0 votes
 
Best answer

Also das array_chunk($items_A, 1) macht keinen Sinn, das können Sie weglassen. Dann brauchen Sie bei der Präsentation auch kein foreach. Aber es stört jetzt auch nicht. Es macht die Datenstruktur nur komplizierter.

Es soll insgesamt 5 Kontrollfragen geben – diese beziehen sich immer auf einen spezifischen Satz, d.h. diese dürfen nicht mit vermischt werden

Wenn die Kontrollfragen auf einer eigenen Seite stehen sollen, dann müssen Sie m.E. in jedem Durchgang zwei Seiten zeigen. Wenn es kein Kontrollfragen-Item ist, dann wird die jeweils zweite Seite übrsprungen. Das könnte so aussehen:

$i = loopIndex();
$item = $itemBlocks_A[$i];
if (($item[0] == 'SA01') && ($item[1] == 3)) {
  // Kontrollfrage für SA01_03
} elseif (($item[0] == 'SA01') && ($item[1] == 19)) {
  // Kontrollfrage für SA01_19
} else {
  // Nichts anzeigen, Seite wird übersprungen.
}

Ich habe hier mal die vereinfachte Array-Struktur - also ohne array_chunk() - zugrunde gelegt. Und natürlich müssten Sie den IF-Filter auf alle fünf Items ausweiten und Sie müssten mit loopToPage() statt loopPage() arbeiten.

by SoSci Survey (200k points)
selected by s169543
Vielen Dank für die schnelle Antwort!

Die Lösung hat für 5 Test-Items auch wunderbar funktioniert. Nun wollte ich die Lösung für alle 120 Items anpassen. Beim Durchklicken laufen die ersten ca. 50 Items problemlos, danach erscheint folgende Fehlermeldung:

Mit dem Eintrag für pg.stack würden die Zusatz-Daten in diesem Interview die Grenze von 64 KB überschreiten. Der Wert für pg.stack kann daher nicht gespeichert werden. Dies kann zu Fehlern im Fragebogen führen, zum Beispiel zum Abbruch der Befragung.

Nach der Fehlermeldung erscheint jedes Item 2mal, bevor das Ganze bei einem Item "stecken bleibt" und gar nichts mehr macht.

Ich habe in diesem https://support.soscisurvey.de/?qa=13107/fehlermeldung-zusatz-daten-uberschreiten-die-grenze-von-64 Eintrag gelesen, dass es vermutlich am loopToPage() liegt; allerdings weiß ich nicht, wie ich diese Funktion ersetzen kann.

Was kann ich stattdessen tun?
Schlecht :( Und ja, Sie haben ganz korrekt den Eintrag gefunden, dass eine lange Seitenabfolge (ein Loop mit 120 Wiederholungen) schlecht mit dem Überspringen von Seiten zusammengeht.

Wenn Sie auf den Zurück-Knopf verzichten können bzw. diesen gar nicht anbieten, gibt es aber eine einfache Lösung: Notieren Sie dropHistory() im PHP-Code: https://www.soscisurvey.de/help/doku.php/de:create:functions:drophistory
Perfekt - das scheint zu klappen! Vielen Dank!
Nur eine kurze „Rück-Versicherung“ (da dropHistory() gefährlich klingt ;)):
Ich habe das dropHistory(); auf die zweite Seite des Loops gesetzt also hier:

$i = loopIndex();
$items_A = $itemBlocks_A[$i];

if (($items_A[0] == 'SA01') && ($items_A[1] == 3)) {
  question('KO01');
} elseif (($items_A[0] == 'SA01') && ($items_A[1] == 5)) {
  question('KO02');
} elseif (($items_A[0] == 'SA01') && ($items_A[1] == 6)) {
  question('KO03');
} elseif (($items_A[0] == 'SA02') && ($items_A[1] == 1)) {
  question('KO04');
} elseif (($items_A[0] == 'SA02') && ($items_A[1] == 5)) {
  question('KO05');
} elseif (($items_A[0] == 'SA02') && ($items_A[1] == 7)) {
  question('KO06');
} else {
  // Nichts
}

dropHistory();

Passt diese Position?
Ja, das passt. Der Befehl führt dazu, dass die "Historie" der bisher besuchten Seiten - also welche Seiten in welcher Reihenfolge beantwortet wurde - gelöscht wird.
Super - vielen Dank für die Hilfe!
...