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

0 votes

Ich habe 4 Blöcke in meinem Fragebogen. In jedem Teil erfolgt die Abfolge der Seiten (hier = items) gemäß einer Variablen aus einem Zufallsgenerator. Zusätzlich dazu werden in jedem Block einige Seiten aus dieser Abfolge extrahiert, in sich ge-shufflet, und dann wieder in die Abfolge eingefügt. Das passiert in jedem Block für 4 items des Typs AE und 2 items des Typs LC (siehe https://support.soscisurvey.de/?qa=4159/rotation-gewisser-seiten-zusatzlich-zu-zufallsgenerator&show=4186#c4186).

Nun würde ich in jedem Block mittels put () gerne festhalten, in welcher Reihenfolge die AE-items und die LC-items dem Teilnehmer präsentiert wurden. Hierfür habe ich 4 interne Variablen für die AE-Items (ZF09, ZF11, ZF12, ZF13, i.e. für jeden Block eine) und 4 interne Variablen für die LC-items (ZF10, ZF14, ZF15, Z16, wieder für jeden Block eine) erstellt. Die internen Variablen für die AE-items haben 4 Variablen (da hier 4 items rotieren, die internen Varialben für die LC-items haben 2 Varialben (da hier 2 items rotieren).

Den php-code habe ich pro Block jeweils unter den Code, der die Seitenabfolge/Rotation der AE bzw. LC items steuert, plaziert. Das sieht für Block 1 beispielsweise so aus:

$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;
}

for ($i=0; $i<count($freePages); $i++) {
  // Rang speichern wie oben
  $id = id('ZF09', $freePages[$i] + 1);
  put($id, $i + 1);
}

for ($i=0; $i<count($freePages2); $i++) {
  // Rang speichern wie oben
  $id = id('ZF10', $freePages2[$i] + 1);
  put($id, $i + 1);
}

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

Allerdings scheint irgendetwas nicht zu funktionieren, obwohl in der debug-Ansicht kein Fehler im php-Code angezeigt wird. Klicke ich mich durch den Fragebogen und gehe dann auf 'Daten ansehen', sehe ich immer nur einen Wert für die erste Variable der jeweiligen internen Variablen, (also ZF09_01, ZF10_01 etc.). Ich habe es dann mit einem anderen Code probiert, der nicht den Rang, sondern den Wert aus dem array speichern sollte (dieser Code funktioniert für mich in einem anderen Teil des Fragebogens, nämlich wenn ich die einzelnen Blöcke selbst shuffle und diese Reihenfolge festhalten will). Hier der code für Block 1:

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

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

Leider besteht noch immer dasselbe Problem, und ich bin mittlerweile ratlos, was falsch läuft...

in SoSci Survey (dt.) by s088878 (290 points)
Klappt die korrekate Rotation mittlerweile - passt die gemischte Abfolge, also? Ich gehe davon aus und gehe deshalb nru auf das Problem mit dem Speichern ein.
Edit: Klappt doch :)

1 Answer

0 votes

Sie verwenden hier den PHP-Code, um die Rangplätze zu speichern, mit denen die gemischten Items einer Frage angezeigt werden. Der Knackpunkt ist diese Zeile:

$id = id('ZF09', $freePages[$i] + 1);

Wenn Sie die items einer Frage mischen, dann haben diese numerische Codes - und entsprechend können Sie aus eine Frage-ID (hier ZF09) und einer Item-ID (z.B. 1 bis 20) eine Kennung basteln.

Sie mischen aber keine Item-IDs, sondern Seitenkennungen. Nun haben Sie zwei Möglichkeiten:

(1) Sie können die Seitenkennungen in der Reihenfolge in eine interne Variable speichern, wie sie angezeigt wurden (nicht besonders elegant).

for ($i=0; $i<count($pages); $i++) {
  $id = id('ZF10', $i + 1);
  put($id, $pages[$i]);
}

(2) Sie können in einem Array definieren, welche Seite ihren Rang in welche interne Variable speichern soll:

$vars = array(
  'C1e1' => 'ZF10_01',
  'C1d1' => 'ZF10_02',
  'C1aem' => 'ZF10_03',
  'C1d2' => 'ZF10_04',
  // u.s.w.
  'C1d7' => 'ZF10_20'
);
foreach ($pages as $rank => $page) {
  if (isset($vars[$page])) {
    put($vars[$page], $rank+1);
  }
}

Sie müssen hier nicht die Ränger aller Seiten abspeichern (einfach im Array weglassen) und Sie müssen die Ränge auch nicht der Reihenfolge nach speichern, sondern können ebenfalls auf zwei Fragen (ZF10 und ZF11, wenn Sie möchten) verteilen. Das kommt darauf an, wie Sie die Daten am Schluss für die Auswertung benötigen.

by SoSci Survey (68.4k points)
Also das scheint jetzt mit folgendem Code gut zu funktionieren:

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

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

Dieser Code speichert mir die Positionen von C1aem, C1aed usw. in der Abfolge $pages, soweit ich das verstanden habe. In der Auswertung wäre es aber noch leichter für mich, wenn ich die Positionen von C1aem, C1aed, C1aemps, C1aempd in der Abfolge $freePages (1, 2, 3 oder 4) und die Positionen von C1lcm, C1lcd in der Abfolge $freePages2 (das wäre dann entweder 1 oder 2) speichern könnte. Würde das mit folgendem Code funktionieren?

$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);
  }
}
Könnte auf den ersten Blick funktionieren ja.

Ich persönlich würde mir Sorgen machen, ob man aus den beiden Abfolgen (jeweils 1-4) in der Auswertung tatsächlich die nötigen Informationen bekommt, zumal das ja noch mit der per Zufallsgenerator gezogenen Abfolge zusammengebracht werden muss. Aber Sie wissen besser als ich, was Sie genau vorhaben.
Also der Code scheint zu funktionieren.

Danke für den Hinweis. Mir persönlich wäre ein Wissen um die Position in den Abfolgen 1-4 bzw. 1-2 wichtiger, und die Position in Bezug auf die per Zufallsgenerator gezogene Abfolge könnte man zur Not noch rekonstruieren (viel Arbeit, aber genauso viel Arbeit wäre es für mich, die Positionen von C1aem, C1aed etc. in $pages auf ihre Position in $freePages bzw. $freePages2 händisch zu rekodieren, was ich sonst machen müsste...). Aber ich werde noch darüber nachdenken :)
Sie können auch beides Speichern - wenn Sie möchten. Variablen sind billig :)
Danke, das ist eine gute Idee - das werd ich mal versuchen :).
...