Ich bin ein größer Freund davon, mit wenigen Seiten zu arbeiten, denn das erlaubt in Rotationen und Randomisierungen mehr Kontrolle über die Inhalte. Ich würde deshalb in beiden Blöcken immer wieder dieselben beiden Seiten mittels loopToPage() wiederholen. IIm Block 1 (wo immer der kommt) wird dann eine der beiden Seiten übersprungen.
Wir brauchen außerdem eine Datenstruktur für die Stimuli - nicht zu verwechseln mit den Daten, die Sie am Ende bekommen. Und zwar würde ich für Ihre Rotation empfehlen, dass Sie diese nach Bereichen gliedern. Es sind 5 Bereiche à 4 Stimuli. Also z.B.
$stimuli = [
1 => [1,2,3,4],
2 => [5,6,7,8],
...
5 => [17,18,19,20]
];
Wenn Sie sich das als Tabelle mit 4 Spalten vorstellen und die Zeilen in sich jeweils rotieren, dann haben Sie bereits pro Spalte die Stimuli für Block 1a, Block 1b, Block 2a und Block 2b.
Block1a (loss frame) und Block (1b) werden dann nochmal unterneinander gemischt, keine Sorge. Also, beginnen wir mit dem Mischen jeder Zeile.
foreach (array_keys($stimuli) as $bereich) {
shuffle($stimuli[$bereich]);
}
debug($stimuli);
Jetzt können wir unsere Teilblöcke bauen. Block 1 bekommt die erste und zweite Spalte, einmal mit gain-frame (1) und einmal mit loss-Frame (2).
$block1 = [];
// Erstmal Block 1a
foreach (array_keys($stimuli) as $bereich) {
// Die Liste $block wird jedesmal um ein Element ergänzt
$block1[] = [
$stimuli[$bereich][0], // Die erste Spalte aus dem gemischten Array von oben
1 // Code für das gain-Frame
];
}
// Und dann Block 1b
foreach (array_keys($stimuli) as $bereich) {
// Die Liste $block wird jedesmal um ein Element ergänzt
$block1[] = [
$stimuli[$bereich][1], // Die zweite Spalte aus dem gemischten Array von oben
2 // Code für das loss-Frame
];
}
// Das Ergebnis können wir uns schonmal ansehen
debug($block1);
Hier die Ausgabe des Ergebnis soweit:
Fügen wir noch eine dritte Spalte mit dem pos/neg Outcome hinzu:
$outcomes = [1,1,1,1,1,2,2,2,2,2];
shuffle($outcomes);
foreach (array_keys($block1) as $i) {
$block1[$i][2] = $outcomes[$i];
}
Und zur Sicherheit notieren wir auch die Block-Nummer noch als vierte Spalte:
foreach (array_keys($block1) as $i) {
$block1[$i][3] = 1;
}
Die Reihenfolge der Zeilen mischen wir noch:
shuffle($block1);
debug($block1);
Das Ergebnis ist m.E. schon ganz brauchbar:
Wenn man diese Zeilen nun von oben nach unten abarbeitet, dann startet man mit: Stimulus 19 im loss-Frame, das negative Outcome kommt zuerst und das Ganze gehört zu Block 1.
Block 2 kann man analog in eine zweite Variable schreiben. Und das Zusammenbauen der beiden Variablen mittels array_merge()
in der Reihenfolge 1/2 oder 2/1 (das kann man mittels Zufallsgenerator entscheiden) sollte auch kein Problem sein. Wenn soweit alles passt (?), machen wir weiter :)