0 votes
in SoSci Survey (dt.) by s046155 (210 points)

Hallo lieber Sosci Survey Online Support,

ich versuche gerade Fragen mit shuffle() für meine vier Teilnehmer-Untergruppen zu rotieren.

Aktuell leite ich die 2x2 Untergruppen (die aus 2 Hauptgruppen mittels Urnenziehung gezogen wurden) erfolgreich zur richtigen Fragenkombi der Demoseite am Anfang zu.
Dafür nutze ich die folgenden 4 php-Codes:
....

// Gruppe A sieht A-Videos

if (value('GR07_01') == 'R_02') {
  question('RD03');
  question('RD16');
}

....

// Gruppe A sieht B-Videos

if (value('GR07_01') == 'R_01') {
  question('ES03');
  question('ES16');
}

...

// Gruppe B sieht A-Videos

if (value('GR08_01') == 'S_01') {
  question('ES02');
  question('ES16');
}

...

// Gruppe B sieht B-Videos

if (value('GR08_01') == 'S_02') {
  question('RD02');
  question('RD16');
}

...
Nun würde ich gern die folgenden 6 Fragenkombis pro Untergruppe rotieren lassen.
In einem 1. Schritt habe ich mich an der Rotation von 3 Fragenkombis versucht:

if (!isset($blocks)) {
  // Liste mit Frage-Kennungen und zugehörigen Bildern
  $blocks = [
    ['ES04', 'ES17'],
    ['ES06', 'ES18'],
    ['ES08', 'ES20'],
  ];
 
  // Die Liste mischen
  shuffle($blocks);
  // Die Listen auf allen Seiten verfügbar machen
  registerVariable($blocks);
}
 
// Anzeige der Blöcke
$i = loopPage(count($blocks));
 
// Frage anzeigen
question($blocks[$i]);

Laut Debug-Info werden auch immer jeweils 2 Fragen erstellt, also z.B. ES08 und ES20. Leider ist jedoch nur jeweils die 1. Frage auch sichtbar --> hier ES08
Das mit dem shufflen scheint ansonsten zu funktionieren :)

Daneben frage ich mich noch, wie ich meine Gruppenauswahl, z.B.

if (value('GR07_01') == 'R_02')

und die Rotation

if (!isset($blocks))

verbinden kann.

Für Hilfe bin ich sehr dankbar!

Beste Grüße,
Jule

1 Answer

0 votes
by SoSci Survey (329k points)
selected by s046155
 
Best answer

In Ihrem PHP-Code mischen Sie die Reihenfolge der drei Blöcke innerhalb von $blocks. Dabei könnte z.B. herauskommen:

[
    ['ES08', 'ES20'],
    ['ES06', 'ES18'],
    ['ES04', 'ES17']
];

Oder mit Indizes geschrieben:

[
    0 => ['ES08', 'ES20'],
    1 => ['ES06', 'ES18'],
    2 => ['ES04', 'ES17']
];

Wenn Sie nun $blocks[$i] abrufen, und $i hat in der ersten Runde den Wert 0, dann bekommen Sie zurück:

['ES08', 'ES20']

Wenn Sie das an question() übergeben, wird der Befehl versuchen, eine kombinierte Frage aus den beiden Fragen zu basteln.

question(['ES08', 'ES20']);

Wenn Sie die beiden Fragen separat anzeigen möchten, dann brauchen Sie auch zweimal question(), und müssen in jedem befehl nur auf eine der beiden Kennungen verweisen:

question($blocks[$i][0]);
question($blocks[$i][1]);

Oder etwas allgemeiner geschrieben:

foreach ($blocks[$i] as $frage) {
    question($frage);
}
by s046155 (210 points)
edited by s046155
Auch auf die Gefahr hin, dass sich das hier zum längsten Support-Thread überhaupt entwickelt, muss ich noch eine Nachfrage stellen ;) .

Der Code funktioniert fast perfekt, allerdings habe ich noch zwei Probleme:

1. Überlagern sich die ersten beiden Fragen (z.B. ES04, ES17) irgendwie, also beide werden lt. debug erstellt, aber sichtbar ist nur die jeweils erste (hier ES04) der beiden. Irgendwie werden die wohl kombiniert?

2. Wenn nach Klick auf WEITER die AT-Frage auf der Folgeseite erscheint, werden darüber auch die beiden Fragen, z.B. ES04 und ES17 angezeigt (auch wieder überlagert) --> Frage AT wird 1a dargestellt. Falls Problem 2 nicht so einfach lösbar ist, könnte ich damit aber zur Not auch leben.

Der Vollständigkeit halber noch der Code zum Ergebnis:


    if (!isset($blocks)) {
// Liste mit Frage-Kennungen und zugehörigen Bildern
  $blocks = [
    [['ES05', 'ES17'], ['AT04']],
    [['ES07', 'ES18'], ['AT08']],
    [['ES09', 'ES20'], ['AT10']],
    [['ES11', 'ES19'], ['AT06']],
    [['ES13', 'ES22'], ['AT02']],
    [['ES15', 'ES21'], ['AT12']]
  ];
 
// Die Liste mischen
  shuffle($blocks);

// Die Listen auf allen Seiten verfügbar machen
  registerVariable($blocks);
}
 
// Fragen anzeigen
$id = loopPage(count($blocks));
$qPack = $blocks[$id];
foreach ($qPack as $qID) {
  question($qID);
}

Danke nochmal für den besten Support, den ich je erlebt habe und entspannte Ostern!
by SoSci Survey (329k points)
> Irgendwie werden die wohl kombiniert?

Ja, Sie haben in Ihrem Code den Teil mit dem array_merge() vergessen. Oben brauchen Sie ein

if (!isset($questions)) {

und vor der schließenden Klammer dann statt

  registerVariable($blocks);

ein

  foreach ($blocks as $blocks) {
    $questions = array_merge($questions, $blocks);
  }
  registerVariable($questions);

Sonst haben Sie die Blöcke wieder nicht auf 2 Seiten.
by s046155 (210 points)
Nachdem ich die Fehlermeldung bekommen habe, dass $questions noch nicht definiert wurde und daher ein Fehler in der Zeile

$questions = array_merge($questions, $blocks);

angezeigt wurde, habe ich dem Code nochmal separat das Array für questions zugefügt. (Obwohl ich dachte, dass das in den Blocks schon drin steckt)

Daraufhin wird die Seite leider wieder 18 mal wiederholt und eine neue Fehlermeldung "Invalid argument supplied for foreach()" taucht auf für die folgende Zeile:

foreach ($qPack as $qID) {


Mein Code insgesamt:

if (!isset($questions)) {

// Liste mit Frage-Kennungen und zugehörigen Bildern
  $blocks = [
    [['ES05', 'ES17'], ['AT04']],
    [['ES07', 'ES18'], ['AT08']],
    [['ES09', 'ES20'], ['AT10']],
    [['ES11', 'ES19'], ['AT06']],
    [['ES13', 'ES22'], ['AT02']],
    [['ES15', 'ES21'], ['AT12']]
  ];

// Liste mit Folgefragen als array definieren
$questions = [
    'AT04',
    'AT08',
    'AT10',
    'AT06',
    'AT02',
    'AT12'
 ];
 
// Die Liste mischen
  shuffle($blocks);

// Arrays verbinden
foreach ($blocks as $blocks) {
    $questions = array_merge($questions, $blocks);
  }
  registerVariable($questions);
}

// Fragen anzeigen
$id = loopPage(count($questions));
$qPack = $questions[$id];
foreach ($qPack as $qID) {
  question($qID);
}
}
by SoSci Survey (329k points)
Stimmt, da fehlt noch eine Zeile:

// Arrays verbinden
$questions = [];   // diese Zeile fehlte
foreach ($blocks as $blocks) {
    $questions = array_merge($questions, $blocks);
}
registerVariable($questions);

Das obere $questions = [...] sollten Sie aber wieder rauswerfen.
by s046155 (210 points)
Ich kann es kaum glauben, aber jetzt funktioniert die Befragung tatsächlich wie geplant :)

Tausend Dank!

VG

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

...