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

In meinem Fragebogen befinden sich 4 Blöcke, die in randomisierter Abfolge präsentiert werden sollen.

Die Abfolge der Seiten innerhalb 1 Blocks erfolgt gemäß einer von 6 "prototypischen" Seitenabfolgen, die mittels Zufallsgenerator gezogen wird. Zusätzlich werden allerdings immer jeweils 4 und 2 Seiten aus dieser Abfolge herausgenommen und untereinander rotiert (siehe https://support.soscisurvey.de/?qa=4159/rotation-gewisser-seiten-zusatzlich-zu-zufallsgenerator&show=4186#c4186). Für diesen Befehl habe ich die Funktion setPageOrder()s 1x pro Block verwendet. Das Problem: die kommt sich dann mit dem setPageOrder() von der Rotation der Blöcke in die Quere.

Wir haben dann hier besprochen, dass ich anscheinend sämtliche Codes auf der ersten möglichen Seite platzieren müsste, aber die Details sind mir noch nicht ganz klar. Platziere ich auf dieser Seite also zuerst:

// Erst einmal die Seitenkennungen als Array speichern
$blocks = array(
  'Cond1' => array('C1in', 'C1p', 'C1ready', 'C1e1', 'C1d1', 'C1aed', 'C1d2', 'C1d3', 'C1aem', 'C1lcm', 'C1e2', 'C1d4', 'C1d5', 'C1aemps', 'C1d6', 'C1lcd', 'C1aempd', 'C1d7', 'C1done'),
  'Cond2' => array('C2in', 'C2p', 'C2ready', 'C2e1', 'C2d1', 'C2aed', 'C2d2', 'C2d3', 'C2aem', 'C2lcm', 'C2e2', 'C2d4', 'C2d5', 'C2aemps', 'C2d6', 'C2lcd', 'C2aempd', 'C2d7', 'C2done'),
  'Cond3' => array('C3in', 'C3p', 'C3ready', 'C3e1', 'C3d1', 'C3aed', 'C3d2', 'C3d3', 'C3aem', 'C3lcm', 'C3e2', 'C3d4', 'C3d5', 'C3aemps', 'C3d6', 'C3lcd', 'C3aempd', 'C3d7', 'C3done'),
  'Cond4' => array('C4in', 'C4p', 'C4ready', 'C4e1', 'C4d1', 'C4aed', 'C4d2', 'C4d3', 'C4aem', 'C4lcm', 'C4e2', 'C4d4', 'C4d5', 'C4aemps', 'C4d6', 'C4lcd', 'C4aempd', 'C4d7', 'C4done'));
// Jetzt noch die Reihenfolge der Blöcke zufällig mischen
shuffle($blocks);

for ($i=0; $i<count($blocks); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('ZF05', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $blocks[$i][0]);
}

// Jetzt das Ergebnis noch als Seitenabfolge festlegen
// Weiter soll es anschließend mit Seite 'FQ0' gehen
setPageOrder($blocks, 'FQ0');
debug($blocks);

und dann sämtliche codes für die Rotatien innerhalb der Blöcke, wie z.B. (für Block 1):

$block1 = value('ZF06x1', 'label');
$pages = explode(',', $block1);
$freeIndices = array();
$freePages = array();
foreach ($pages as $i => $page) {
  if (substr($page, 2, 2) == 'ae') {
    $freeIndices[] = $i;
    $freePages[] = $page;
  }
}
shuffle($freePages);
foreach ($freePages as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages[$orgIndex] = $page;
}

$freeIndices = array();
$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;
}

$vars = array(
  'C1aem' => 'ZF09_01',
  'C1aed' => 'ZF09_02',
  'C1aemps' => 'ZF09_03',
  'C1aempd' => 'ZF09_04',
   'C1lcm' => 'ZF10_01',
  'C1lcd' => 'ZF10_02',

);
foreach ($freePages as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

foreach ($freePages2 as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

$vars = array(
  'C1aem' => 'ZF17_01',
  'C1aed' => 'ZF17_02',
  'C1aemps' => 'ZF17_03',
  'C1aempd' => 'ZF17_04',
   'C1lcm' => 'ZF21_01',
  'C1lcd' => 'ZF21_02',

);
foreach ($pages as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

debug($block1);  // Original-Abfolge
debug($pages);  // Gemischte Abfolge
debug($freePages); 
debug($freePages2); 
setPageOrder($pages, 'C1done');

Und was passiert mit den 4 zusätzlichen setPageOrder-Befehlen?

2 Answers

0 votes
by s088878 (310 points)

Also ich glaube, ich könnte das jetzt geschafft haben:
1) Zuerst $pages, $freePages, $freePages2 für jeden Block entsprechend benennen --> $pages1, $freePages1a, $freePages1b etc.
2) In der Zufallsvariablen 'C1done' in jeder möglichen Abfolge an letzter Stelle platzieren, sowie 'C1in', 'C1p', 'C1ready' am Anfang jeder Abfolge.
3) die Zeile mit dem setPageOrder() überall löschen
4) Das array für blocks ändern: $blocks = array($pages1, $pages2, $pages3, $pages4);
5) Alles zusammenfügen: im PHP-code zuerst jeden Block einzeln mischen, dann die Blöcke untereinander mischen, dann setPageOrder($blocks, 'FQ0');

Das gibt mir dann folgenden Code:

//Block 1 mischen
$block1 = value('ZF06x1', 'label');
$pages1 = explode(',', $block1);
$freeIndices = array();
$freePages1a = array();
foreach ($pages1 as $i => $page) {
  if (substr($page, 2, 2) == 'ae') {
    $freeIndices[] = $i;
    $freePages1a[] = $page;
  }
}
shuffle($freePages1a);
foreach ($freePages1a as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages1[$orgIndex] = $page;
}

$freeIndices = array();
$freePages1b = array();
foreach ($pages1 as $i => $page) {
  if (substr($page, 2, 2) == 'lc') {
 $freeIndices[] = $i;
    $freePages1b[] = $page;
  }
}
shuffle($freePages1b);
foreach ($freePages1b as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages1[$orgIndex] = $page;
}

$vars = array(
  'C1aem' => 'ZF09_01',
  'C1aed' => 'ZF09_02',
  'C1aemps' => 'ZF09_03',
  'C1aempd' => 'ZF09_04',
   'C1lcm' => 'ZF10_01',
  'C1lcd' => 'ZF10_02',

);
foreach ($freePages1a as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

foreach ($freePages1b as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

$vars = array(
  'C1aem' => 'ZF17_01',
  'C1aed' => 'ZF17_02',
  'C1aemps' => 'ZF17_03',
  'C1aempd' => 'ZF17_04',
   'C1lcm' => 'ZF21_01',
  'C1lcd' => 'ZF21_02',

);
foreach ($pages1 as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

debug($block1);  // Original-Abfolge
debug($pages1);  // Gemischte Abfolge
debug($freePages1a); 
debug($freePages1b); 

//Block 2 mischen

$block2 = str_replace('C1', 'C2', value('ZF06x2', 'label'));
$pages2 = explode(',', $block2);
$freeIndices = array();
$freePages2a = array();
foreach ($pages2 as $i => $page) {
  if (substr($page, 2, 2) == 'ae') {
    $freeIndices[] = $i;
    $freePages2a[] = $page;
  }
}
shuffle($freePages2a);
foreach ($freePages2a as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages2[$orgIndex] = $page;
}

$freeIndices = array();
$freePages2b = array();
foreach ($pages2 as $i => $page) {
  if (substr($page, 2, 2) == 'lc') {
    $freeIndices[] = $i;
    $freePages2b[] = $page;
  }
}
shuffle($freePages2b);
foreach ($freePages2b as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages2[$orgIndex] = $page;
}


$vars = array(
  'C2aem' => 'ZF11_01',
  'C2aed' => 'ZF11_02',
  'C2aemps' => 'ZF11_03',
  'C2aempd' => 'ZF11_04',
   'C2lcm' => 'ZF14_01',
  'C2lcd' => 'ZF14_02',

);
foreach ($freePages2a as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

foreach ($freePages2b as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

$vars = array(
  'C2aem' => 'ZF18_01',
  'C2aed' => 'ZF18_02',
  'C2aemps' => 'ZF18_03',
  'C2aempd' => 'ZF18_04',
   'C2lcm' => 'ZF22_01',
  'C2lcd' => 'ZF22_02',

);
foreach ($pages2 as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

debug($block2);  // Original-Abfolge
debug($pages2);  // Gemischte Abfolge
debug($freePages2a); 
debug($freePages2b); 

Code geht weiter in der 2. Antwort, ging sich aufgrund der Zeichenbeschränkung nicht ganz aus...

0 votes
by s088878 (310 points)

Rest vom Code:

//Block 3 mischen
$block3 = str_replace('C1', 'C3', value('ZF06x3', 'label'));
$pages3 = explode(',', $block3);
$freeIndices = array();
$freePages3a = array();
foreach ($pages3 as $i => $page) {
  if (substr($page, 2, 2) == 'ae') {
    $freeIndices[] = $i;
    $freePages3a[] = $page;
  }
}
shuffle($freePages3a);
foreach ($freePages3a as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages3[$orgIndex] = $page;
}

$freeIndices = array();
$freePages3b = array();
foreach ($pages3 as $i => $page) {
  if (substr($page, 2, 2) == 'lc') {
    $freeIndices[] = $i;
    $freePages3b[] = $page;
  }
}
shuffle($freePages3b);
foreach ($freePages3b as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages3[$orgIndex] = $page;
}

$vars = array(
  'C3aem' => 'ZF12_01',
  'C3aed' => 'ZF12_02',
  'C3aemps' => 'ZF12_03',
  'C3aempd' => 'ZF12_04',
   'C3lcm' => 'ZF15_01',
  'C3lcd' => 'ZF15_02',

);
foreach ($freePages3a as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

foreach ($freePages3b as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

$vars = array(
  'C3aem' => 'ZF19_01',
  'C3aed' => 'ZF19_02',
  'C3aemps' => 'ZF19_03',
  'C3aempd' => 'ZF19_04',
   'C3lcm' => 'ZF23_01',
  'C3lcd' => 'ZF23_02',

);
foreach ($pages3 as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

debug($block3);  // Original-Abfolge
debug($pages3);  // Gemischte Abfolge
debug($freePages3a); 
debug($freePages3b); 

//Block 4 mischen
$block4 = str_replace('C1', 'C4', value('ZF06x4', 'label'));
$pages4 = explode(',', $block4);
$freeIndices = array();
$freePages4a = array();
foreach ($pages4 as $i => $page) {
  if (substr($page, 2, 2) == 'ae') {
    $freeIndices[] = $i;
    $freePages4a[] = $page;
  }
}
shuffle($freePages4a);
foreach ($freePages4a as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages4[$orgIndex] = $page;
}

$freeIndices = array();
$freePages4b = array();
foreach ($pages4 as $i => $page) {
  if (substr($page, 2, 2) == 'lc') {
    $freeIndices[] = $i;
    $freePages4b[] = $page;
  }
}
shuffle($freePages4b);
foreach ($freePages4b as $j => $page) {
  $orgIndex = $freeIndices[$j];
  $pages4[$orgIndex] = $page;
}

$vars = array(
  'C4aem' => 'ZF13_01',
  'C4aed' => 'ZF13_02',
  'C4aemps' => 'ZF13_03',
  'C4aempd' => 'ZF13_04',
   'C4lcm' => 'ZF16_01',
  'C4lcd' => 'ZF16_02',

);
foreach ($freePages4a as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

foreach ($freePages4b as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

$vars = array(
  'C4aem' => 'ZF20_01',
  'C4aed' => 'ZF20_02',
  'C4aemps' => 'ZF20_03',
  'C4aempd' => 'ZF20_04',
   'C4lcm' => 'ZF24_01',
  'C4lcd' => 'ZF24_02',

);
foreach ($pages4 as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}


debug($block4);  // Original-Abfolge
debug($pages4);  // Gemischte Abfolge
debug($freePages4a); 
debug($freePages4b); 


// Erst einmal die Blöcke als Array speichern
$blocks = array($pages1, $pages2, $pages3, $pages4);
// Jetzt noch die Reihenfolge der Blöcke zufällig mischen
shuffle($blocks);

for ($i=0; $i<count($blocks); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('ZF05', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $blocks[$i][0]);
}

// Jetzt das Ergebnis noch als Seitenabfolge festlegen
// Weiter soll es anschließend mit Seite 'FQ0' gehen
setPageOrder($blocks, 'FQ0');
debug($blocks);
by s088878 (310 points)
Lieber Support,
ich glaube meine oben angegebene Lösung funktioniert, aber ich hoffe sie birgt nicht wieder irgendwelche Risiken. Ich würde mich freuen wenn ihr vllt. kurz einen Blick darauf werfen könntet, ob euch das logisch erscheint. Danke :)!

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

...