0 votes
in SoSci Survey (dt.) by s088878 (310 points)

Hallo,
In meinem Experiment habe ich 4 Blöcke, die alle Seiten (=items) des Typs AE, LC, D und E aufweisen.

In einem anderen post (https://support.soscisurvey.de/?qa=4082/mehrere-urnen-bereits-gezogene-abfolgen-seiten-nicht-ziehen&show=4151#c4151) haben wir schon besprochen, dass die Abfolge der Seiten in jedem Block gemäß gewisser Grundstrukturen erfolgen soll (z.B. E,D,AE,D,LC,AE,D,D,E,D,AE,LC,D,AE,D), die ich in einem Zufallsgenerator sammle.

Zusätzlich soll eine Rotation auf der Ebene der einzelnen items des Typs AE und LC (jeweils innerhalb eines Blocks) erfolgen: dh. die AE items in Block I sollen untereinander rotieren, die AE items in Block II sollen untereinander rotieren usw. Dasselbe gilt für die LC items.

Wie kann ich das in SoSci Survey umsetzen? Vielen Dank schon mal!

1 Answer

0 votes
by SoSci Survey (301k points)

Ich bleibe lieber bei den "richtigen" Seitenabfolgen, das ist weniger abstakt:

C1e1,C1d1,C1aem,C1d2,C1lcm,C1aed,C1d3,C1d4,C1e2,C1d5,C1mpd,C1lcd,C1d6,C1mps,C1d7

Schritt 1: Wir ziehen die Seiten-Abfolge aus dem Zufallsgenerator. Schritt 2: Wir extrahieren die "ae"-Elemente.

$block = value('RG01x1', 'label');
$pages = explode(',', $block);
$freeIndices = array();
$freePages = array();
foreach ($pages as $i => $page) {
  if (substr($page, 2, 2) == 'ae') {
    $freeIndices[] = $i;
    $freePages[] = $page;
  }
}

Okay, nun haben wir neben einer Liste der Seiten ($pages) noch eine Listen der "ae"-Seiten ($freePages) und eine Liste, von welchen Indizes aus $pages diese kommen ($freeIndices). Fein. Mischen wir.

shuffle($freepages);

Und nun fügen wir an jedem der original-Indizes (Positonen) einen der Werte ein.

foreach ($freePages as $j => $page) {
  $orgindex = $freeIndices[$j];
  $pages[$orgIndex] = $page;
}

Ja, das muss man vielleicht zweimal lesen. Aber es ist herrlich einfach. Sehen wir uns das Ergebnis noch an - und ab damit in setPageOrder()

debug($block);  // Original-Abfolge
debug($pages);  // Gemischte Abfolge
setPageOrder($pages);
by s088878 (310 points)
Danke! Muss ich in array() jetzt noch meine ae-Seiten einsetzen? Wie erkennt das System, welche Seiten die ae-Seiten sind? (2 dieser Seiten enthalten ae in der Kennung, 2 andere jedoch nicht; aber wenn nötig kann ich die Kennung dieser Seiten entsprechend ändern...).
by s088878 (310 points)
edited by s088878
Edit: Zuerst gings nicht wg. eines Fehlers im PhP Code ($orgindex vs. $orgIndex), zumindest erscheint jetzt keine Fehlermeldung mehr. Allerdings habe ich das Gefühl dass da nichts rotiert. Die ae-items kommen immer in der gleichen Abfolge...
by s088878 (310 points)
Ah, jetzt klappts! Seitenkennungen anpassen war selbstverständlich nötig.
Jetzt würde ich dasselbe gerne noch mit den lc-Seiten machen. Ich habe deshalb den Code 'verdoppelt' u. angepasst und dazukopiert:
$freePages2 = array();
foreach ($pages as $i => $page) {
  if (substr($page, 2, 2) == 'lc') {
    $freeIndices[] = $i;
    $freePages2[] = $page;
  }
}
shuffle($freePages2);
foreach ($freePages2 as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages[$orgIndex] = $page;
}

Nur shufflet es mir jetzt leider nicht die lc Seiten untereinander, sondern lc + ae Seiten zusammen (bzw. manchmal habe ich gewisse lc Seiten doppelt). Irgendwas stimmt hier also noch nicht. Wie würde das denn richtig aussehen?
by SoSci Survey (301k points)
Sie müssen auch $freeIndices am Anfang noch löschen/neu initialisieren:

$freeIndices = array();
by s088878 (310 points)
Vielen Dank!! Scheint jetzt geklappt zu haben :)!

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

...