0 votes
in SoSci Survey (dt.) by s077420 (150 points)

Hallo lieber SoSci Survey Support,

ich habe einen funktionierenden Code, um die Reihenfolge meiner Fragen zu rotieren, jedoch habe ich das Problem, dass wenn ich den Fragebogen teste, dass manche Fragen mehrmals angezeigt werden (dann mit der zuvor abgegebenen Antwort) und andere Fragen gar nicht angezeigt werden anstatt dass jede Frage einmal präsentiert wird. Ich habe schon alles mögliche probiert, aber finde nicht heraus woran das liegt, ich vermute irgendwas am loopPage Befehl.. wisst ihr woran das liegen könnte?

if (value('GR01') == 1) {

$i = array('01', '02', '03', '04');

shuffle($i);

// hier alle items 1 - 21 erstellen (read und like Frage rotiert)

# Item1
$item1q = array('RE'.$i[0], 'LI'.$i[0]);
shuffle($item1q);
$item1 = array('IT'.$i[0], $item1q[0], $item1q[1]);

# Item2
$item2q = array('RE'.$i[1], 'LI'.$i[1]);
shuffle($item2q);
$item2 = array('IT'.$i[1], $item2q[0], $item2q[1]);

# Item 3
$item3q = array('RE'.$i[2], 'LI'.$i[2]);
shuffle($item3q);
$item3 = array('IT'.$i[2], $item3q[0], $item3q[1]);

# Item 4
$item4q = array('RE'.$i[3], 'LI'.$i[3]);
shuffle($item4q);
$item4 = array('IT'.$i[3], $item4q[0], $item4q[1]);
}


// Liste der Fragen erstellen
if (!isset($fragen)) {
  // Liste der Frage-Kennungen definieren
  $fragen = [
$item1,
$item2,
$item3,
$item4
  ];
  
// Die Rotation für eine eventuelle Wiederholung der Seite zwischenspeichern
registerVariable($fragen);
}

// Teil 2: Fragen getrennt auf seperaten Seiten anzeigen
$a = loopPage(count($fragen));
question($fragen[$a][0]);
question($fragen[$a][1]);
question($fragen[$a][2]);

1 Answer

0 votes
by SoSci Survey (328k points)

Nutzen Sie statt shuffle() besser einen Zufallsgenerator, vgl. Fragen rotieren.

Warum es bei Ihnen vermutlich nicht funktioniert? Weil Sie den Code mit dem shuffle() bei jeder Wiederholung erneut ausführen. Wenn Sie beim shuffle() bleiben wollten, müssten Sie also zumindest das registerVariable($fragen) noch um ein isset() im Filter ergänzen.

Aber wie gesagt: Der Zufallsgenerator ist dafür viel besser geeignet, der nimmt Ihnen all diese Details ab.

by s077420 (150 points)
Vielen Dank für die Antwort!
Einen Zufallsgenerator habe ich bereits für die zufällige Zuteilung zu den 2 Bedingungen (Kennung 'GR01').
Mit shuffle erstelle ich dann 21 Fragen ("item 1-21"; jeweils ein Bild und dazu zwei Fragen in zufälliger Reihenfolge (dafür shuffle) werden in einem array gespeichert), ich glaube das kann ich nicht mit einem Zufallsgenerator machen.
Erst danach kommt dann die Rotation der Reihenfolge der Fragen mit registerVariable($fragen), isset() ist in dem Filter schon dabei.
by SoSci Survey (328k points)
> Reihenfolge (dafür shuffle) werden in einem array gespeichert), ich glaube das kann ich nicht mit einem Zufallsgenerator machen.

Doch. Sie legen einfach die 21 Werte in den Zufallsgenerator und stellen ein, dass pro Interview 21 Codes gezogen werden.

> isset() ist in dem Filter schon dabei.

Aber nicht in dem IF-Filter, wo die Reihenfolge gemischt wird ;)
by s077420 (150 points)
> Aber nicht in dem IF-Filter, wo die Reihenfolge gemischt wird ;)
Achso, danke! Das habe ich jetzt probiert, jetzt kommt jede Frage einmal, allerdings immer in der gleichen Reihenfolge (1,2,3,4), also irgendwas stimmt leider immer noch nicht ganz. So sieht der Code aus:

if (value('GR01') == 1) {

$i = array('01', '02', '03', '04');

// hier if isset und registerVariable dazu ?
if (!isset($i)) {
    shuffle($i);
    registerVariable($i);
}


# Item1
$item1q = array('RE'.$i[0], 'LI'.$i[0]);
shuffle($item1q);
$item1 = array('IT'.$i[0], $item1q[0], $item1q[1]);

# Item2
$item2q = array('RE'.$i[1], 'LI'.$i[1]);
shuffle($item2q);
$item2 = array('IT'.$i[1], $item2q[0], $item2q[1]);

# Item 3
$item3q = array('RE'.$i[2], 'LI'.$i[2]);
shuffle($item3q);
$item3 = array('IT'.$i[2], $item3q[0], $item3q[1]);

# Item 4
$item4q = array('RE'.$i[3], 'LI'.$i[3]);
shuffle($item4q);
$item4 = array('IT'.$i[3], $item4q[0], $item4q[1]);

}

// ...
by s077420 (150 points)
> Doch. Sie legen einfach die 21 Werte in den Zufallsgenerator und stellen ein, dass pro Interview 21 Codes gezogen werden.

Bisher habe ich das nicht hinbekommen. Normalerweise kann man ja einfach die Kennungen aus dem Fragenkatalog in den Zufallsgenerator eingeben, aber meine Fragen erstelle ich durch php Code (da ich verschiedene Fragetypen habe, die ich rotiere und mit einem Bild kombiniere), also sind sie nicht im Fragenkatalog aufgeführt. Wie kann ich Fragen, die ich mit php Code erstellt habe, in den Zufallsgenerator legen? Ich habe schon verschiedenes probiert, z.B. $item1, 'item1', aber das hat nicht geklappt.
by SoSci Survey (328k points)
> also irgendwas stimmt leider immer noch nicht ganz.

Ja, Sie überschreiben das (vorher gemischte) Array jetzt beim zweiten Aufrufe der Seite:

$i = array('01', '02', '03', '04');

Das muss also auch in den IF-Filter, der dafür sorgt, dass das Array genau einmal definiert und gemischt wird. Oder Sie nehmen halt doch den Zufallsgenerator.

> Normalerweise kann man ja einfach die Kennungen aus dem Fragenkatalog in den Zufallsgenerator eingeben

Oder in Ihrem Fall einfach '01' bis '04'. Statt $i[0] nehmen Sie dann value('RG02_01', 'label').
by s077420 (150 points)
> $i = array('01', '02', '03', '04');
Das muss also auch in den IF-Filter, der dafür sorgt, dass das Array genau einmal definiert und gemischt wird.

Also muss das array in beide if Filter? Ich hab das probiert, aber bei mir klappt das noch nicht:

if (value('GR01') == 1) {

$i = array('01', '02', '03', '04');

if (!isset($i)) {
    
    $i = array('01', '02', '03', '04');
    shuffle($i);
    
    registerVariable($i);
}

# Item1
$item1q = array('RE'.$i[0], 'LI'.$i[0]);
shuffle($item1q);
$item1 = array('IT'.$i[0], $item1q[0], $item1q[1]);

// ...

}
by s077420 (150 points)
Mit dem Zufallsgenerator habe ich es auch weiter probiert, aber ich habe

> Oder in Ihrem Fall einfach '01' bis '04'. Statt $i[0] nehmen Sie dann value('RG02_01', 'label').

nicht ganz verstanden. Also welches §i[0] meinen Sie, wo das "value('RG02_01', 'label')" hin soll?
by s077420 (150 points)
Ich habe folgenden Code probiert:

if (value('GR02', 'label') == 1) {
question($item1);
} elseif (value('GR02', 'label') == 2) {
question($item2);
}

Aber es kommt die Fehlermeldung "Die Variable GR02 gibt es in diesem Projekt nicht (siehe Variablen-Übersicht).", obwohl es die Variable gibt und auch so in der Übersicht aufgeführt wird. Auch mit einem neuen Zufallsgenerator mit anderer Kennung kam diese Fehlermeldung.
by SoSci Survey (328k points)
Sie brauchen für die Rotation die Wert '01', '02', '03', '04' in gemischer Abfolge. In Ihrem obigen Code haben Sie ein Array mittels shuffle() gemischt und dann via $i[0] auf den Wert an Stelle 1 zugegriffen:

$item1q = array('RE'.$i[0], 'LI'.$i[0]);

Wenn Sie nun den Zufallsgenerator verwenden, bekommen Sie den Wert über value(), das könnte dann so aussehen:

$num = value('RG01x1', 'label');
$item1q = array('RE'.$num, 'LI'.$num);

Sehen Sie sich mit debug() an, was Sie in den Variablen "liegen" haben:

debug(value('RG01x1', 'label'));

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

...