0 votes
in SoSci Survey (dt.) by s109850 (245 points)

Liebes Support-Team,

ich habe bereits für meinen Fragebogen den PHP-Code für Rotation und Mischen von Blöcken geschrieben. Soweit funktioniert dieser auch, nur benötige ich noch etwas anderes bzw. noch ein paar zusätzliche Dinge.

Der Fragebogen besteht aus 8 Blöcken zu je 10 Seiten. Vor jedem dieser 8 Blöcke habe ich noch eine Instruktionsseite eingefügt (Block 1, Block 2, etc.). Die Instruktionsseiten sollen nicht rotiert werden sowie deren chronologische Reihenfolge beibehalten. Auch dürfen nur die Inhalte/Items bestimmter Blöcke miteinander rotieren.

Die Items von Block 1 und Block 6.
Die Items von Block 2 und Block 5.
Die Items von Block 3 und Block 8.
Die Items von Block 4 und Block 7.

Die Items sind als zusammengehörig zu betrachten und dürfen nicht getrennt werden (Bild + Frage). Bitte um Hilfe.

https://www.soscisurvey.de/test155917/?act=rmMdAewXQWfzl9h1j8XsfTbJ

by SoSci Survey (327k points)
Verstehe ich Sie korrekt, dass Sie auch die Seiten aus mehreren Blöcken (1 und 6 zum Beispiel) untereinander mischen möchten? Und davor soll eine gemeinsame Instruktionsseite kommen?

Sie haben Sie ein Item pro Seite, korrekt?
by s109850 (245 points)
Ja genau, nur die Seiten von bestimmen Blöcken dürfen untereinander gemischt werden. Die Instruktionsseiten sollen fixiert sein - insgesamt gibt es 8 Instruktionsseiten.

Ja, ein Item (= Frage + Bild) auf jeder Seite.

2 Answers

0 votes
by SoSci Survey (327k points)
selected by s109850
 
Best answer

Als Beispiel Block 1 + Block 6 - diese beiden Blöcke beinhalten denselben Stimulus-Typen (Fragentyp kognitive Empathie + Bilditem positiv), daher dürfen nur zwischen diesen Blöcken die Seiten gemischt/randomisiert werden.

Das macht es einfacher. In diesem Fall bauen Sie das Ausgangs-Array nochmal ein wenig um:

if (!isset($rotation)) {
  $rotation = array(
    // Block 1 + Block 6
    1 => array('H106', 'H107', 'H108', 'H109', 'H110', 'H111', 'H112', 'H113', 'H114', 'H115', 'H116'),
    6 => array('H161', 'H162', 'H163', 'H164', 'H165', 'H166', 'H167', 'H168', 'H169', 'H170', 'H171'),
    // Block 2 + Block 5
    2 => array('H117', 'H118', 'H119', 'H120', 'H121', 'H122', 'H123', 'H124', 'H125', 'H126', 'H127'),
    5 => array('H150','H151', 'H152', 'H153', 'H154', 'H155', 'H156', 'H157', 'H158', 'H159', 'H160'),
    // Block 3 + Block 8
    3 => array('H128', 'H129', 'H130', 'H131', 'H132', 'H133', 'H134', 'H135', 'H136', 'H137', 'H138'),
    8 => array('H183', 'H184', 'H185', 'H186', 'H187', 'H188', 'H189', 'H190', 'H191', 'H192', 'H193ende'),
    // Block 4 + Block 7
    4 => array('H139', 'H140', 'H141', 'H142', 'H143', 'H144', 'H145', 'H146', 'H147', 'H148', 'H149'),
    7 => array('H172', 'H173', 'H174', 'H175', 'H176', 'H177', 'H178', 'H179', 'H180', 'H181', 'H182')
  );
  // Die Blöcke paarweise mischen
  $pairs = array(
    array(1,6),
    array(2,5),
    array(3,8),
    array(4,7)
  );
  foreach ($pairs as $pair) {
    $set1 = $rotation[$pair[0]];
    $set2 = $rotation[$pair[1]];
    $in1 = array_shift($set1);
    $in2 = array_shift($set2);
    // Mischen ohne die Instruktionen
    $pages = array_merge($set1, $set2);
    shuffle($pages);
    // Und in 2 Teile trennen
    $set1 = array_slice($pages, 0, count($rotation[$pair[0]]) - 1);
    $set2 = array_slice($pages, count($rotation[$pair[0]]) - 1);
    array_unshift($set1, $in1);
    array_unshift($set2, $in2);
    $rotation[$pair[0]] = $set1;
    $rotation[$pair[1]] = $set2;
  }
  registerVariable($rotation);
}
setPageOrder($rotation, 'X');

Ja, zugegeben, durch die Schleifen und die Dopplung in der Mitte sieht es ein wenig länglich aus. Aber das liegt auch daran, dass ich die Schritte alle schön einzeln aufgeführt habe. Der Code sollte also halbwegs lesbar sein... sonst gerne fragen.

by s109850 (245 points)
Vielen Dank - die Blöcke erscheinen nun in der passenden Reihenfolge. Die Instruktionsseiten jedoch nicht :/ Diese erscheinen weiterhin den Doppelblöcken entsprechend, also 1, 6, 2, 5, 3, 8, 4 und 7
by SoSci Survey (327k points)
Ähm ja ... stimmt. Bitte sortieren Sie das Array $rotation am Anfang noch in der richtigen Reihenfolge. Also das 6 => erst unter 5 =>.
by s109850 (245 points)
Alles klar, es klappt - DANKE!
0 votes
by SoSci Survey (327k points)

Ja genau, nur die Seiten von bestimmen Blöcken dürfen untereinander gemischt werden.

AM einfachsten wird das funktionieren, wenn Sie das Ganze als 4 Blöcke verstehen. Erstellen Sie ein verschachteltes Array mit 4 Arrays mit den Seiten-Kennungen (aus jeweils 2 der 8er-Blöcke). Die 4 Arrays lassen Sie mischen. Und dann stellen Sie mittels array_unshift() noch die Instruktionsseite voran. Und dann können Sie die 4 Blöcke noch mischen oder nicht - je nach Bedarf.

Falls die 4 Blöcke immer in derselben Reihenfolge erscheinen, können Sie die Instruktionsseiten auch fest im Fragebogen verankern und dort jeweils das setPageOrder() für einen Block verwenden.

Und falls die Doppelblöcke nach dem Mischen wieder auf zwei Teile aufgeteilt werden sollen, hilft array_slice() weiter.

by s109850 (245 points)
Ich habe es nun mit dem folgenden Code versucht, leider funktioniert dieser nicht. Ich erhalte zwar keine Fehlermeldung, aber die Seiten werden nur einmal rotiert - die Reihenfolge sollte sich aber bei jedem Versuch ändern. Auch werden manche Seiten doppelt in einem Block angezeigt - noch habe ich nicht array_slice() angewendet, da ich nicht weiß wie - habe als Erklärung nur einen Code mit dem Inhalt print_r gefunden, hier bekomme ich sofort diese Warnung: Die Funktion print_r() ist nicht zur Verwendung im Fragebogen freigegeben.

// Erst einmal die Seitenkennungen als Array speichern
$rotation = array(
    // Block 1 + Block 6
    'A' => array('H106', 'H107', 'H108', 'H109', 'H110', 'H111', 'H112', 'H113', 'H114', 'H115', 'H116', 'H161', 'H162', 'H163', 'H164', 'H165', 'H166', 'H167', 'H168', 'H169', 'H170', 'H171'),
    // Block 2 + Block 5
    'B' => array('H117', 'H118', 'H119', 'H120', 'H121', 'H122', 'H123', 'H124', 'H125', 'H126', 'H127', 'H150','H151', 'H152', 'H153', 'H154', 'H155', 'H156', 'H157', 'H158', 'H159', 'H160'),
    // Block 3 + Block 8
    'C' => array('H128', 'H129', 'H130', 'H131', 'H132', 'H133', 'H134', 'H135', 'H136', 'H137', 'H138', 'H183', 'H184', 'H185', 'H186', 'H187', 'H188', 'H189', 'H190', 'H191', 'H192', 'H193ende'),
    // Block 4 + Block 7
    'D' => array('H139', 'H140', 'H141', 'H142', 'H143', 'H144', 'H145', 'H146', 'H147', 'H148', 'H149', 'H172', 'H173', 'H174', 'H175', 'H176', 'H177', 'H178', 'H179', 'H180', 'H181', 'H182')
  );
// Jeden Block einzeln mischen
foreach ($rotation as $key => $pages) {
  // Die Instruktionsseiten aus dem Array $pages herausnehmen
    $H106 = array_shift($pages);
    $H161 = array_shift($pages);
    $H117 = array_shift($pages);
    $H150 = array_shift($pages);
    $H183 = array_shift($pages);
    $H161 = array_shift($pages);
    $H139 = array_shift($pages);
    $H172 = array_shift($pages);
  // Den Rest mischen
  shuffle($pages);
  // Alles wieder zusammenfügen
  array_unshift($pages, $H106, $H161, $H117, $H150, $H183, $H161, $H139, $H172);
  // Und in das Array $rotation zurückspeichern
  $rotation[$key] = $pages;
}
// Jetzt das Ergebnis noch als Seitenabfolge festlegen
// Weiter soll es anschließend mit Seite 'X' gehen
setPageOrder($rotation, 'X');
by SoSci Survey (327k points)
Sie verwenden in Ihrem Code des öfteren array_shift() und array_unshift(). Sowie ich den Code verstehe, ist das (gar) nicht sinnvoll.

Wenn Sie jeweils die erste und zwölfte Seite aus der Liste "fixieren" möchten, müsste es innerhalb des foreach() eher wie folgt aussehen:

foreach ($rotation as $key => $pages) {
  // Seiten 1 und 12 herausnahmen
  $in1 = array_splice($pages, 0, 1);
  $in2 = array_splice($pages, 10, 1);  // Vorsicht: Die 12. Seite ist nun auf Pos. 11 und hat damit den Index 10
  // Mischen
  shuffle($pages);
  // Die beiden Instruktionsseiten wieder einfügen
  array_splice($pages, 0, 0, [$in1]);
  array_splice($pages, 11, 0, [$in2]);
  // Und in das Array $rotation zurückspeichern
  $rotation[$key] = $pages;
}
by s109850 (245 points)
Vielen Dank! Das funktioniert soweit. Leider habe ich noch ein Problem bzgl. dem Trennen der zuvor zusammengelegten Blöcke . Ich hätte nun folgendes versucht, klappt aber nicht

  $A = array('H106', 'H107', 'H108', 'H109', 'H110', 'H111', 'H112', 'H113', 'H114',
  'H115', 'H116', 'H161', 'H162', 'H163', 'H164', 'H165', 'H166', 'H167', 'H168',
  'H169', 'H170', 'H171');
  $result= array_slice($A,0,10);
  $A = array('H106', 'H107', 'H108', 'H109', 'H110', 'H111', 'H112', 'H113', 'H114',
  'H115', 'H116', 'H161', 'H162', 'H163', 'H164', 'H165', 'H166', 'H167', 'H168',
  'H169', 'H170', 'H171');
  $result= array_slice($A,11,10);
by SoSci Survey (327k points)
Weshalb möchten Sie die Blöcke nochmals trennen?
by s109850 (245 points)
Weil der Task verlangt, dass die Valenz der Stimuli (positiv vs. negativ) variiert. Wenn ich die Blöcke nicht wieder trenne, haben die aufeinanderfolgenden Blöcke dieselbe Valenz.
by SoSci Survey (327k points)
Das heißt, Sie müssen die Stimuli abhängig von der Block-Zugehörigkeit nochmals variieren? Oder die Fragestellung?

Und nur nochmal zur Sicherheit: Muss auch die Abfolge der Blöcke gemischt werden oder nur die Stimuli innerhalb der (Doppel-)Blöcke?
by s109850 (245 points)
Als Beispiel Block 1 + Block 6 - diese beiden Blöcke beinhalten denselben Stimulus-Typen (Fragentyp kognitive Empathie + Bilditem positiv), daher dürfen nur zwischen diesen Blöcken die Seiten gemischt/randomisiert werden. Block 1 soll aber an erster Stelle gezeigt werden und Block 6 an sechster Stelle - dies ist so festgelegt. Die (Einzel-)Blöcke sollen folglich der Reihe nach getrennt erscheinen, also Block 1, 2, 3, 4, 5, 6, 7 und 8.

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

...