0 votes
in SoSci Survey (dt.) by s117326 (125 points)
edited by SoSci Survey

Liebes Sosci Survey-Team,

Über folgenden Code lassen wir unsere 32 Items rotieren:

if (!isset($blocks)) {
  $blocks = array(  // Liste der Frage-Kennungen und zugehöriger Bilder
    array('D101', 'Inc_Other1.png'),
    array('D102', 'Inc_Other2.png'),
    array('D103', 'Inc_Other3.png'),
    array('D104', 'Inc_Other4.png'),
    array('D105', 'Inc_Other5.png'),
    array('D106', 'Inc_Other6.png'),
    array('D107', 'Inc_Other7.png'),
    array('D108', 'Inc_Other8.png'),
    array('D201', 'Inc_Self1.png'),
    array('D202', 'Inc_Self2.png'),
    array('D203', 'Inc_Self3.png'),
    array('D204', 'Inc_Self4.png'),
    array('D205', 'Inc_Self5.png'),
    array('D206', 'Inc_Self6.png'),
    array('D207', 'Inc_Self7.png'),
    array('D208', 'Inc_Self8.png'),
    array('D301', 'Inst_Other1.png'),
    array('D302', 'Inst_Other2.png'),
    array('D303', 'Inst_Other3.png'),
    array('D304', 'Inst_Other4.png'),
    array('D305', 'Inst_Other5.png'),
    array('D306', 'Inst_Other6.png'),
    array('D307', 'Inst_Other7.png'),
    array('D308', 'Inst_Other8.png'),
    array('D401', 'Inst_Self1.png'),
    array('D402', 'Inst_Self2.png'),
    array('D403', 'Inst_Self3.png'),
    array('D404', 'Inst_Self4.png'),
    array('D405', 'Inst_Self5.png'),
    array('D406', 'Inst_Self6.png'),
    array('D407', 'Inst_Self7.png'),
    array('D408', 'Inst_Self8.png')
    );
 
  // Die Liste mischen
  shuffle($blocks);
  // Die Listen auf allen Seiten verfügbar machen
  registerVariable($blocks);
}
 
// Anzeige der Blöcke
$i = loopToPage('frage', 33);
html('<p><img src="'.$blocks[$i][1].'" alt="Dilemma"></p>');


if (getRoute() == 'next') {
  $nowTime = time();
  $dt = $nowTime - $curTime;
  put(id('IV01', $i + 1), $dt);  // $i stammt aus dem $i = loopIndex()
  $curTime = $nowTime;
}

Nächste Seite:

$i = loopIndex();
question($blocks[$i][0]);

Da wir zur Zuordnung der Verweildauer die Reihenfolge der Items benötigen, habe ich über folgenden Befehl versucht die Reihenfolge im Datensatz zu speichern:

$random = array();
for ($i=0; $i<count($blocks); $i++) {
  // Rang speichern wie oben
  $id = id('IV02', $blocks[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $random[$i] = $pages[$blocks[$i]];
}

Dieser Code ergibt allerdings eine Fehlermeldung und weiß nicht genau was ich noch ausprobieren könnte.

Über Ihre Hilfe würde ich mich sehr freuen!

1 Answer

+1 vote
by SoSci Survey (323k points)

Da wir zur Zuordnung der Verweildauer die Reihenfolge der Items benötigen

Meine Empfehlung wäre, dass Sie gleich im Fragebogen rechnen. Aber damit das funktioniert (wie auch das Speichern der Reihenfolge), sollten Sie ausnahmsweise nicht das komplette Array mischen, sondern nur die "Schlüssel".

Klingt komplizierter als es ist. Also...

$blocks = array(  // Liste der Frage-Kennungen und zugehöriger Bilder
    array('D101', 'Inc_Other1.png'),
    array('D102', 'Inc_Other2.png'),
    array('D103', 'Inc_Other3.png'),
    array('D104', 'Inc_Other4.png'),
    array('D105', 'Inc_Other5.png'),
    array('D106', 'Inc_Other6.png'),
    array('D107', 'Inc_Other7.png'),
    array('D108', 'Inc_Other8.png'),
    array('D201', 'Inc_Self1.png'),
    array('D202', 'Inc_Self2.png'),
    array('D203', 'Inc_Self3.png'),
    array('D204', 'Inc_Self4.png'),
    array('D205', 'Inc_Self5.png'),
    array('D206', 'Inc_Self6.png'),
    array('D207', 'Inc_Self7.png'),
    array('D208', 'Inc_Self8.png'),
    array('D301', 'Inst_Other1.png'),
    array('D302', 'Inst_Other2.png'),
    array('D303', 'Inst_Other3.png'),
    array('D304', 'Inst_Other4.png'),
    array('D305', 'Inst_Other5.png'),
    array('D306', 'Inst_Other6.png'),
    array('D307', 'Inst_Other7.png'),
    array('D308', 'Inst_Other8.png'),
    array('D401', 'Inst_Self1.png'),
    array('D402', 'Inst_Self2.png'),
    array('D403', 'Inst_Self3.png'),
    array('D404', 'Inst_Self4.png'),
    array('D405', 'Inst_Self5.png'),
    array('D406', 'Inst_Self6.png'),
    array('D407', 'Inst_Self7.png'),
    array('D408', 'Inst_Self8.png')
);
if (!isset($order)) {
  $order = array_keys($blocks);
  // Die Liste mischen
  shuffle($order);
  // Die Listen auf allen Seiten verfügbar machen
  registerVariable($order);
}

// Anzeige der Blöcke
$i = loopToPage('frage', count($order));
html('<p><img src="'.$blocks[$order[$i]][1].'" alt="Dilemma"></p>');

Was hat sich geändert? Die Blöcke bleiben wie sie sind, aber es gibt ein neues Array $order, welches einfach die Zahlen von 0 bis 32 enthält, entsprechend den 33 Einträgen im $blocks Array. Diese Abfolge wird gemischt.

In der letzten Zeile sehen Sie dann, dass es nicht mehr $blocks[$i] heißt, sondern $blocks[$order[$i]]. Das vereinfacht jetzt die Speicherung der Zeiten. Und hier kann auch gleich gerechnet werden (gespeichert in IV03, die Sie noch anlegen müssen).

if (getRoute() == 'next') {
  put(id('IV01', $order[$i] + 1), time());
  if ($i > 0) {
    $prevTime = value(id('IV01', $order[$i - 1] + 1));
    put(id('IV03', $order[$i - 1] + 1), time() - $prevTime);    
  }
}

In IV02 bekommen Sie nun alle Zeiten - mit Ausnahme der letzten. Dafür müssen sie auf der Seite nach "frage" noch folgendes ergänzen:

if (getRoute() == 'next') {
  $i = count($order);
  $prevTime = value(id('IV01', $order[$i - 1] + 1));
  put(id('IV03', $order[$i - 1] + 1), time() - $prevTime);    
}

... habe ich über folgenden Befehl versucht die Reihenfolge im Datensatz zu speichern:

Auch das ist nun einfacher. Wenn Sie z.B. den Rang speichern möchten:

for ($i=0; $i<count($order); $i++) {
  $id = id('IV02', $order[$i] + 1);
  put($id, $i + 1);
}

Wenn Stimulus 3 als erstes angezeigt würde, dann würde IV02_03 den Wert 1 speichern. Diese FOR-Schleife können Sie noch in dem isset()-FIlter direkt nach dem registerVariable() ausführen - das muss nicht 33-mal gemacht werden.

by s117326 (125 points)
Vielen, vielen Dank! Nach ein wenig Herumprobieren hat der Code super funktioniert und wir bekommen im Output in IV02 und IV03 jetzt die Ränge sowie die Verweildauer angezeigt. Wir wundern und lediglich über den Output in IV01, der lange Zahlenreihen beinhaltet - könnten sie und sagen was das zu bedeuten hat?
Herzlichen Dank für Ihre Hilfe ;-)
by SoSci Survey (323k points)
Den wollten Sie so oder so ähnlich speichern ;) Das sind die UNIX-Zeitstempel, wann die jeweiligen Seiten aufgerufen wurden. Nachdem Sie diese schonmal hatten, habe ich sie gleich für die Berechnung der Differenzen verwendet.

Stattdessen könnte man ebenso gut mit `registerVariable()` arbeiten und die letzte Zeit in einer PHP-Variable speichern.
by s117326 (125 points)
Liebes Sosci-Survey Team,

Erstmal nochmal vielen Dank für die bisherige Hilfe! Nachdem der Code jetzt super funktioniert hat haben wir bei der Ansicht der Daten bemerkt, dass in IV03 die Zeitdauer gespeichert wird in der die Person auf dem Bild, sowie der zugehörige Frage verweilt, wir benötigen allerdings nur die Zeit in der die Person auf der Frageseite verweilt - kennen Sie dafür eventuell eine Lösung?
by SoSci Survey (323k points)
Ja, dafür müssten Sie die Zeit der Frage-Seite als Referenz verwenden und nicht - wie bisher - den Zeistempel vom vorigen Durchgang. Auf der folgenden Seite müssten Sie dann die Differenz berechnen und speichern.

Der einfachste Weg dafür wäre vermutlich die Verwendung von registerVariable() für die Referenzzeit.
by s117388 (120 points)
Wie würde der Code für die Referenzzeit und die anschließende Berechnung der Differenz aussehen? :)
by SoSci Survey (323k points)
Den Code habe ich in Ihrer neuen Frage gepostet:
https://support.soscisurvey.de/?qa=12418

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

...