0 votes
in SoSci Survey (dt.) by s122462 (165 points)

Hallo miteinander,

ich möchte folgendes umsetzen.

Ich habe in einem Fragebogen einen Block aus fünf Seiten. Diese fünf Seiten sollen in zufälliger Reihenfolge angezeigt werden. Die Reihenfolge soll im Datensatz gespeichert werden, weil sie später im Fragebogen nochmals verwendet werden soll. Wie ich bis dahin vorgehe (Reihenfolge randomisieren mit shuffle() und diese dann in interner Variable mit fünf Ausprägungen speichern) ist mir klar.

Was mir jedoch nicht klar ist, ist, wie ich diese im Datensatz abgespeicherte Reihenfolge später nochmal verwenden kann? Der Block aus den fünf Seiten wird nämlich im Laufe des Fragebogens noch dreimal wiederholt (immer mit kleinen Variationen), und jedesmal sollen die fünf Seiten in der gleichen Reihenfolge angezeigt werden, wie ursprünglich zufällig festgelegt.

Habt Ihr einen kleinen Tipp für mich, wo ich ansetzen muss bzw. wie ich vorgehen kann?

Vielen Dank und herzliche Grüsse
Linda

by SoSci Survey (328k points)
Wenn Sie den PHP-Code posten, mit dem Sie die zufällige Abfolge erstellen und abspeichern (v.a. das ist für die Antwort relevant), kann ich gerne Empfehlungen für die erneute Verwendung geben.

2 Answers

0 votes
by s122462 (165 points)
edited by SoSci Survey

Selbstverständlich!

Bisher habe ich folgenden PHP-Code verwendet (von der Webseite übernommen...):

Die fünf Seiten sind mit B1 bis B5 genannt. Der Rang der Seite wird in der internen Variable BB17_1 bis BB17_5 abgespeichert (z.B. Seite B1 wurde in der Reihenfolge an 3. Stelle gezeigt).

$pages = array('B1', 'B2', 'B3', 'B4', 'B5');
$indices = array_keys($pages);
shuffle($indices);

// Nun die Ränge speichern
$random = array();
for ($i=0; $i<count($indices); $i++) {
  $id = id('BB17', $indices[$i] + 1);
  put($id, $i + 1);
  $random[$i] = $pages[$indices[$i]];
}
by s122462 (165 points)
Wobei ich gerade selbst festgestellt habe, dass zwar in der internen Variable Werte 1 bis 5 abgespeichert werden, die Seiten jedoch noch nicht in dieser Reihenfolge angezeigt werden...
0 votes
by SoSci Survey (328k points)
edited by SoSci Survey

Wobei ich gerade selbst festgestellt habe, dass zwar in der internen Variable Werte 1 bis 5 abgespeichert werden, die Seiten jedoch noch nicht in dieser Reihenfolge angezeigt werden...

Das dürfte daran liegen, dass der Befehl fehlt, welcher die Seitenabfolge anwendet: setPageOrder().

Beachten Sie bitte auch, dass Ihr Code die Rangplätze der Seiten abspeichert, nicht die Seitennamen. Für B3,B1,B2,B4,B5 würden Sie also bekommen 2,3,1,4,5. Denn Die Seite B1 ist auf Rang/Platz 2.

Mit folgendem PHP-Code können Sie die Abfolge auf andere Seiten anwenden:

$intVar = 'IV02';
$pages = array('C1', 'C2', 'C3', 'C4', 'C5');
$order = [];
foreach (getItems($intVar) as $item) {
  $rank = value(id($intVar, $item));
  $order[(int)$rank - 1] = $pages[$item - 1];
}
ksort($order);
debug($order);
setPageOrder($order);

Zumindest hoffe ich das ... testen Sie den Code bitte gründlich. Das debug() hilft dabei.

by s122462 (165 points)
Vielen Dank!

Der erste Teil (die Seiten randomisieren und in der internen Variable abspeichern) funktioniert nun, hier nochmals mein Code:

$pages = array('B1', 'B2', 'B3', 'B4', 'B5');
// Die Seiten nicht direkt mischen, sondern deren Positionen
$indices = array_keys($pages);
shuffle($indices);

// Nun die Ränge speichern - und die neue Abfolge der Seiten in $random speichern
$random = array();
for ($i=0; $i<count($indices); $i++) {
  // Rang speichern wie oben
  $id = id('BB17', $indices[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $random[$i] = $pages[$indices[$i]];
}
//neue Seitenabfolge setzen
setPageOrder($random, 'intro');

Was jedoch noch nicht funktioniert, ist, die Reihenfolge der Seiten zu übernehmen. Hier nochmals der Code für den nächsten Block:

//Reihenfolge der fünf Seiten von vorn übernehmen
$pages = array('BH1', 'BH2', 'BH3', 'BH4', 'BH5');
$order2 = [];
foreach (getItems('BB17') as $item) {
  $rank = value(id('BB17', $item));
  $order2[(int)$rank - 1] = $pages[$item];
}
debug($order2);
setPageOrder($order2);

Ich bekomme diese Debug-Info angezeigt:

Debug-Information für $order2:
3BH2, 1BH3, 2BH4, 4BH5, 0

Also irgendwie fehlt der Indizes für die Seite BH1…

Die ursprünglich festgelegte Reihenfolge war diese:
[Information]    Die interne Variable BB17_05 wird mit dem Wert 1 belegt.
[Information]    Die interne Variable BB17_02 wird mit dem Wert 2 belegt.
[Information]    Die interne Variable BB17_03 wird mit dem Wert 3 belegt.
[Information]    Die interne Variable BB17_01 wird mit dem Wert 4 belegt.
[Information]    Die interne Variable BB17_04 wird mit dem Wert 5 belegt.

Als Fehlermeldung bekomme ich:
Fehler im Fragebogen (Seite 20)
In der Funktion setPageOrder() wurde ein ungültiger Parameter vom Typ NULL angegeben. Als Parameter sind entweder Strings (Texte) erlaubt oder Arrays, die ausschließlich Strings enthalten.

Fehler im Fragebogen (Seite 20)
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined offset: 5
Zeile: 9
PHP-Code
006 $order2 = [];
007 foreach (getItems('BB17') as $item) {
008   $rank = value(id('BB17', $item));
009   $order2[(int)$rank - 1] = $pages[$item];
010 }
011 debug($order2);
012 setPageOrder($order2);

Da ich noch zu wenig Ahnung von PHP habe, erkenne ich den Fehler leider nicht…

Was jedoch ggf. problematisch sein könnte, ist dies: Der Fragebogen ist so aufgebaut, dass die fünf Seiten insgesamt viermal wiederholt werden (d.h. es gibt vier Blöcke à 5 Seiten). Die Reihenfolge der 5 Seiten wird für den ersten Block zufällig bestimmt und soll dann für die Blöcke 2 bis 4 übernommen werden (mein oben geschildertes Problem). Zusätzlich möchte ich jedoch die Reihenfolge der Blöcke 2 bis 4 counterbalancieren.

Hierzu habe ich einen Zufallsgenerator (BB07) angelegt, der alle möglichen Abfolgen der drei Blöcke enthält:

1 = BH0-BH5, BS0-BS5, BD0-BD5
2 = BS0-BS5, BH0-BH5, BD0-BD5
3 = BD0-BD5, BS0-BS5, BH0-BH5
4 = BD0-BD5, BH0-BH5, BS0-BS5
5 = BS0-BS5, BD0-BD5, BH0-BH5
6 = BH0-BH5, BD0-BD5, BS0-BS5

Bevor der zweite Block beginnt, habe ich diesen PHP-Code eingebaut:
$code2 = value('BB07');
$order1 = value('BB07', 'label');
setPageOrder($order1, 'Grafiken');

Einzeln für sich genommen hat es mit dem Rotieren der Blöcke gut funktioniert. Aber vielleicht interferieren meine beiden Versuche, die Blöcke zu rotieren und innerhalb jeden Blocks die Reihenfolge der Seiten zu beeinflussen..?

Vielen Dank für Eure Geduld!!!
by SoSci Survey (328k points)
Es fehlte noch ein ksort() und ein -1 im Code ... ich habe meinen Muster-Code oben in der Antwort nochmal aktualisiert.

Sie müssten bitte die ersten beiden Zeilen mit der Kennung der internen Variable $intVar und den Seiten-Namen bearbeiten.

Wie es mit den 4 Blöcken funktioniert, erkläre ich dann gerne in einer neuen Frage, sons wird es unübersichtlich. Im Prinzip sortieren Sie einfach 4 Seiten-Arrays in der gewünschten Reihenfolge, packen diese in ein verschachteltes Array (4 Arrays in einem Array) und mischen dieses mit shuffle() einmal. bevor Sie es an setPageOrder() übergeben.
by s122462 (165 points)
Vielen Dank! Der Code funktioniert nun.
Gut, dann poste ich die andere Frage separat.

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

...