0 votes
in SoSci Survey (dt.) by s137634 (700 points)

Guten Tag,

aufbauend auf meiner Frage hier (https://support.soscisurvey.de/?qa=22390/seitenkennungen-und-variablen-in-if-befehlen-benutzen) würde ich gerne wissen, ob es auch möglich wäre, nicht nur die Auswahl zu speichern, die als letzte getroffen wurde, sondern auch alle vorherigen.

Um das ganze kurz zusammen zu fassen:
In meinem Skript wird auf einer Seite ein Array randomisiert, das vier Blöcke (weitere Arrays), à 7 Seiten enthält, die auch randomisiert werden. Die Probanden können auf jeder der Seiten die Auswahl "ja" oder "nein" treffen. Meine Frage oben bezog sich darauf, dass ich (auf einer anderen Seite - die Reihenfolgen werden in einer global definierten variable gespeichert) in einer internen Variablen speichern wollte, welche "ja"-Antwort pro Block zeitlich als letzte getätigt wurde (weil die Reihenfolge der Seiten ja durcheinander ist, reicht deren Position im Skript dafür nicht aus). Wenn keine "ja"-Antwort getätigt wurde, dann sollte einfach ein "keiner" in die interne Variable geschrieben werden.

Das Skript, das ich mit der Hilfe des Supports erstellen konnte, sieht folgendermaßen aus:

$fragen = [
  's1GU1' => 'SG01',
  's2GU1' => 'SG02',
  's3GU1' => 'SG03',
  's4GU1' => 'SG16',
  's5GU1' => 'SG04',
  's6GU1' => 'SG21',
  's7GU1' => 'SG22',
  's1GU2' => 'SG05',
  's2GU2' => 'SG06',
  's3GU2' => 'SG07',
  's4GU2' => 'SG08',
  's5GU2' => 'SG09',
  's6GU2' => 'SG25',
  's7GU2' => 'SG23',
  's1GU3' => 'SG10',
  's2GU3' => 'SG11',
  's3GU3' => 'SG17',
  's4GU3' => 'SG18',
  's5GU3' => 'SG19',
  's6GU3' => 'SG26',
  's7GU3' => 'SG27',
  's1GU4' => 'SG12',
  's2GU4' => 'SG13',
  's3GU4' => 'SG20',
  's4GU4' => 'SG14',
  's5GU4' => 'SG15',
  's6GU4' => 'SG28',
  's7GU4' => 'SG24',
 ];

put('IV08_01', -1);
put('IV08_02', -1);
put('IV08_03', -1);
put('IV08_04', -1);

foreach ($Seq_GUNeu as $block => $pages) {
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
  }
}


//Speicherung der Codierung der Position für Block 1
if( (value('IV08_01') == 's1GU1')
)  { 
put('IV08_05', 1);
put('IV08_09', 'Distraktor 1');
}
if( (value('IV08_01') == 's2GU1')
)  { 
put('IV08_05', 2);
put('IV08_09', 'Distraktor 2');
}
if( (value('IV08_01') == 's3GU1')
)  { 
put('IV08_05', 3);
put('IV08_09', 'Distraktor 3');
}
if( (value('IV08_01') == 's4GU1')
)  { 
put('IV08_05', 4);
put('IV08_09', 'Distraktor 4');
}
if( (value('IV08_01') == 's5GU1')
)  { 
put('IV08_05', 5);
put('IV08_09', 'Distraktor 5');
}
if( (value('IV08_01') == 's6GU1')
)  { 
put('IV08_05', 6);
put('IV08_09', 'Target 1');
}
if( (value('IV08_01') == 's7GU1')
)  { 
put('IV08_05', 7);
put('IV08_09', 'Target 2');
}
if( (value('IV08_01') == -1)
)  { 
put('IV08_05', -1);
put('IV08_09', 'Keiner');
}

//speicherung der Codierung der Position für Block 2
if( (value('IV08_02') == 's1GU2')
)  { 
put('IV08_06', 1);
put('IV08_10', 'Distraktor 1');
}
if( (value('IV08_02') == 's2GU2')
)  { 
put('IV08_06', 2);
put('IV08_10', 'Distraktor 2');
}
if( (value('IV08_02') == 's3GU2')
)  { 
put('IV08_06', 3);
put('IV08_10', 'Distraktor 3');
}
if( (value('IV08_02') == 's4GU2')
)  { 
put('IV08_06', 4);
put('IV08_10', 'Distraktor 4');
}
if( (value('IV08_02') == 's5GU2')
)  { 
put('IV08_06', 5);
put('IV08_10', 'Distraktor 5');
}
if( (value('IV08_02') == 's6GU2')
)  { 
put('IV08_06', 6);
put('IV08_10', 'Target 1');
}
if( (value('IV08_02') == 's7GU2')
)  { 
put('IV08_06', 7);
put('IV08_10', 'Target 2');
}
if( (value('IV08_02') == -1)
)  { 
put('IV08_06', -1);
put('IV08_10', 'Keiner');
}

//speicherung der Codierung der Position für Block 3
if( (value('IV08_03') == 's1GU1')
)  { 
put('IV08_07', 1);
put('IV08_11', 'Distraktor 1');
}
if( (value('IV08_03') == 's2GU3')
)  { 
put('IV08_07', 2);
put('IV08_11', 'Distraktor 2');
}
if( (value('IV08_03') == 's3GU3')
)  { 
put('IV08_07', 3);
put('IV08_11', 'Distraktor 3');
}
if( (value('IV08_03') == 's4GU3')
)  { 
put('IV08_07', 4);
put('IV08_11', 'Distraktor 4');
}
if( (value('IV08_03') == 's5GU3')
)  { 
put('IV08_07', 5);
put('IV08_11', 'Distraktor 5');
}
if( (value('IV08_03') == 's6GU3')
)  { 
put('IV08_07', 6);
put('IV08_11', 'Target 1');
}
if( (value('IV08_03') == 's7GU3')
)  { 
put('IV08_07', 7);
put('IV08_11', 'Target 2');
}
if( (value('IV08_03') == -1)
)  { 
put('IV08_07', -1);
put('IV08_11', 'Keiner');
}

//speicherung der Codierung der Position für Block 4
if( (value('IV08_04') == 's1GU4')
)  { 
put('IV08_08', 1);
put('IV08_12', 'Distraktor 1');
}
if( (value('IV08_04') == 's2GU4')
)  { 
put('IV08_08', 2);
put('IV08_12', 'Distraktor 2');
}
if( (value('IV08_04') == 's3GU4')
)  { 
put('IV08_08', 3);
put('IV08_12', 'Distraktor 3');
}
if( (value('IV08_04') == 's4GU4')
)  { 
put('IV08_08', 4);
put('IV08_12', 'Distraktor 4');
}
if( (value('IV08_04') == 's5GU4')
)  { 
put('IV08_08', 5);
put('IV08_12', 'Distraktor 5');
}
if( (value('IV08_04') == 's6GU4')
)  { 
put('IV08_08', 6);
put('IV08_12', 'Target 1');
}
if( (value('IV08_04') == 's7GU4')
)  { 
put('IV08_08', 7);
put('IV08_12', 'Target 2');
}
if( (value('IV08_04') == -1)
)  { 
put('IV08_08', -1);
put('IV08_12', 'Keiner');
}
}

Ich brauche für die Auswertung der Daten nun aber auch mögliche "ja"-Auswahlen, die zuvor getroffen wurden. Ein Teilnehmer kann ja nur auf einer der sieben Seiten "ja" sagen, aber auch insgesamt zwei Mal oder sogar auf allen Seiten "ja" ankreuzen. Das würde ich ebenfalls gerne in eine (neue) interne Variable schreiben, und zwar in der Reihenfolge, in der diese "ja"-Auswahlen getätigt wurden. Um das verständlicher zu machen vielleicht ein Beispiel: Wenn die Blöcke nach der Randomisierung folgende Reihenfolge haben:

Block 2
Block 1
Block 4
Block 3

und die Seiten in Block 2 dann z.B. so vorliegen:

S3, S2, S7, S5, S1, S4, S6

könnte der Teilnehmer ja z.B. auf Seite 3, "nein" auswählen, auf Seite 2 ebenfalls. Auf Seite 7 würde er dann "ja" sagen, auf Seite 5 wieder "nein", auf Seite 1 und 4 wieder "ja" und auf Seite 6 wieder "nein"

S3 - nein
S2 - nein
S7 - ja
S5 - nein
S1 - ja
S4 - ja
S6 - nein

Dann würde im Augenblick gespeichert werden, dass Seite 4 als letztes mit "ja" beantwortet wurde. Das Programm würde mir dann die Seitenkennung "S4GU2" (s. Skript) raussuchen und in meine interne Variable eine 4 schreiben. Ich hätte aber gerne, dass es eben auch Seite 1 erfasst und mir als nächstes eine 1 aufschreibt (weil das die vorletzte Antwort war) und danach auch noch die Seite 7 mit einer 7 (weil dies die erste "ja"-Antwort war). Analog soll das mit allen "ja"-Antworten passieren und dann natürlich für alle Blöcke.

Wie muss das Skript dafür angepasst werden?

Ich hoffe ich konnte verständlich machen, was mein Anliegen ist.
Liebe Grüße und vielen Dank im Voraus!

4 Answers

0 votes
by SoSci Survey (304k points)
edited by SoSci Survey

und zwar in der Reihenfolge, in der diese "ja"-Auswahlen getätigt wurden

Mein erster Gedanke galt hier eine sinnvollen Datenstruktur.

Ich würde vorschlagen, dass Sie 4 x 7 = 28 interne Variablen anlegen. Nachdem Sie das Ganze "pro Block" haben möchten, bietet es sich an, dass Sie das in 4 Fragen (interne Variablen) à 7 Variablen aufteilen.

In diese Variablen würden Sie dann 1/2 schreiben, entsprechend der Antwort im Fragebogen, aber eben in der Reihenfolge, wie es abgefragt wurde. Das könnte dann so aussehen:

01 02 03 04 05 06 07
  1   2   2   1   2   1   2

Dort wäre es so gewesen, dass beim ersten, vierten und sechsten Item "Ja" ausgewählt wurde. In der anderen Variable wäre die 6 gespeichert worden.

Und dann haben Sie ja diese hübsche Schleife im Code, welche die Blöcke und Fragen in der Reihenfolge durchgeht, in welcher sie im Fragebogen erscheinen:

foreach ($Seq_GUNeu as $block => $pages) {
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
  }
}

Unter dem IF müssten Sie nur noch zwei weitere Zeilen ergänzen:

foreach ($Seq_GUNeu as $block => $pages) {
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
    $saveID2 = id($intVarID, $pos);
    put($saveID2, value($frage));
  }
}

Dort wird also in die Variable an der entsprechenden Stelle einfach nochmal der Wert aus de Ja/Nein-Auswahl geschrieben. Bevor Sie das testen: So funktioniert es noch nicht, denn wir benötigen noch die Variable $intVarID. Das beschreibt die Frage-Kennung der interne Variablen-Frage, welche zu dem Block gehört.

Und an der Stelle bin ich unsicher. Denn dafür müsste ich wissen, was genau in der Variable $Seq_GUNeu steht. Da ist die Frage, ob wir aus den pages die passende Block-Variable herausfinden können oder ob wir das nochmal separat speichern müssen. Wenn Sie den Code von der Seite mit der Definition von $Seq_GUNeu posten (der steht auch nicht in der "alten" Frage im Support), kann ich mir das nochmal ansehen.

Ergänzung

Sie speichern in drie internen Variablen IV13 ja die Ränge der 4 Blöcke.

$id = id('IV13', $indicesA[$i] + 1);
...
put($id, $i + 1);

Diese müssen wir für die korrekte Zuordnung wieder zurückkodieren.

$blocks = array_flip(array_values(valueList('IV13')));

Das sind ein paar verschachtelte Funktionen. Also kurz zur Erklärung: valueList() holt eine Liste der Ränge, array_values() erstzt die Schlüssel (erstmal die Variablennamen) durch die Indizes 0..3. Und array_flip() tauscht Schlüssel und Werte. Jetzt haben wir also eine Liste: Rang -> Block-Index (=Block-Nummer - 1).

Dann wissen wir jetzt auch, welcher Block z.B. auf dem ersten Rank anezeigt wird. Das können wir nutzen.

$blocks = array_flip(array_values(valueList('IV13')));
foreach ($Seq_GUNeu as $block => $pages) {
  $blockNum = $blocks[$block + 1] + 1;
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
    $saveID2 = id('IV99', $blockNum, $pos);
    put($saveID2, value($frage));
  }
}

So, Sie sehen, wie aus $blocks nun die Variable $blockNum ermittelt wird - und diese wird dann weiter unten verwendet, um eine interne Variable zu kodieren:

  $saveID2 = id('IX', $blockNum, $pos);

Das IX müssen Sie natürlich durch die Rubrik-Kennung ersetzen, wo die 4 neuen internen Variablen stehen. Sie können da natürlich auch rechnen, wenn Ihre neuen Variablen z.B: die Kennungen IV20 bis IV23 haben:

  $saveID2 = id('IV', $blockNum + 19, $pos);
by s137634 (700 points)
Vielen Dank! Ich habe in einer weiteren Antwort geantwortet.
0 votes
by s137634 (700 points)

Vielen Dank für die schnelle Antwort!
Ich habe Ihnen den passenden Ausschnitt des Skripts hier unten gepostet. Ich habe bewusst den ganzen Abschnitt genommen, falls sie den für das Verständnis brauchen. Aber letzten Endes macht das Skript kurz vor dem Ende (ab "//Speichern der Reihenfolge von Targets und Distraktoren in einer internen Variable") vier Mal das Selbe, bevor alles in $Seq_GUNeu gespeichert wird.

// Erst einmal die Seitenkennungen als Arrays speichern
$Seq_GU = array (
'Seq_GU11' => array('s1GU1', 's2GU1', 's3GU1', 
                 's4GU1', 's5GU1', 's7GU1'),

'Seq_GU21' => array('s1GU2', 's2GU2', 's3GU2', 
                 's4GU2', 's5GU2', 's7GU2'),

'Seq_GU31' => array('s1GU3', 's2GU3', 's3GU3', 
                 's4GU3', 's5GU3', 's6GU3'),

'Seq_GU41' => array('s1GU4', 's2GU4', 's3GU4', 
                 's4GU4', 's5GU4', 's6GU4')
);


// Den ersten Block aus dem Array $Seq_GU herausnehmen, etc.
$Seq_GU1 = array_shift($Seq_GU);
$Seq_GU2 = array_shift($Seq_GU);
$Seq_GU3 = array_shift($Seq_GU);
$Seq_GU4 = array_shift($Seq_GU);


//Speichern der Reihenfolge von Targets und Distraktoren in einer internen Variable

$indices1 = array_keys($Seq_GU1);
shuffle($indices1);
registerVariable('indices1');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order1 = array();
for ($i=0; $i<count($indices1); $i++) {
  // Rang speichern wie oben
  $id = id('IV01', $indices1[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order1[$i] = $Seq_GU1[$indices1[$i]];
}

$indices2 = array_keys($Seq_GU2);
shuffle($indices2);
registerVariable('indices2');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order2 = array();
for ($i=0; $i<count($indices2); $i++) {
  // Rang speichern wie oben
  $id = id('IV03', $indices2[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order2[$i] = $Seq_GU2[$indices2[$i]];
}

$indices3 = array_keys($Seq_GU3);
shuffle($indices3);
registerVariable('indices3');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order3 = array();
for ($i=0; $i<count($indices3); $i++) {
  // Rang speichern wie oben
  $id = id('IV04', $indices3[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order3[$i] = $Seq_GU3[$indices3[$i]];
}

$indices4 = array_keys($Seq_GU4);
shuffle($indices4);
registerVariable('indices4');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order4 = array();
for ($i=0; $i<count($indices4); $i++) {
  // Rang speichern wie oben
  $id = id('IV05', $indices4[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order4[$i] = $Seq_GU4[$indices4[$i]];
}

$Seq_GUNeu = [
  1 => $Seq_GU_order1,
  2 => $Seq_GU_order2,
  3 => $Seq_GU_order3,
  4 => $Seq_GU_order4
];
registerVariable('Seq_GUNeu');
by s137634 (700 points)
Vielen Dank für Ihre schnelle Antwort. Ich habe das ergänzt.

Irritiert bin ich allerdings darüber, dass die Variablen IV36_01 - IV 39_07 nicht existieren sollen. ich habe sie nämlich alle angelegt und finde sie auch links oben in der Leiste.

Zudem wird weiterhin ein Fehler in diesem Abschnitt des Codes gemeldet:
Fehler im Fragebogen: Undefined offset: 5

050 $blockNum = $blocks[$block + 1] + 1;
by SoSci Survey (304k points)
> Irritiert bin ich allerdings darüber, dass die Variablen IV36_01 - IV 39_07 nicht existieren sollen.

Stehen sie auch in der "Variable-Liste"?

> Fehler im Fragebogen: Undefined offset: 5

Wenn Sie über oder unter der fraglichen Zeile folgende Zeile ergänzen, was sagt denn dann die Debug-Information?

debug($blocks);
by s137634 (700 points)
edited by SoSci Survey
Guten Tag,

nein, bisher stehen die Variablen nicht in der Liste. Wie genau muss ich diese denn dort einpflegen?

Und ich habe unter der entsprechenden Zeile den Debug-Befehl eingefügt. Folgendes wird auf der Seite in einem gelben Kästchen angezeigt:

Debug-Information für $blocks:
4 0, 3 1, 2 2, 1 3, 7
(wobei die 4, 3, 2 und 1 in klein über der 0, 1, 2 und 3 stehen)
by SoSci Survey (304k points)
Danke für die ausführlichen Debug-Infos. Ich brauche im Moment tatsächlich nur die Information zu $blocks - den Rest habe ich daher entfernt.

Steht da wirklich noch eine 7 dahinter?

Die Ziffern die klein oben stehen, sind die Indizes des Arrays. Die Variable $blocks kommt ja hierher:

$blocks = array_flip(array_values(valueList('IV13')));

Heißt, da wurden die Werte aus IV13 genommen und dann Indizes und Werte vertauscht. Korrekt muss es dann aber heißen:

$blockNum = $blocks[$block] + 1;

Also ein +1 weniger. Dann sollten da Werte von [0..3]+1 = [1..4] herauskommen. Diese werden dann weiter unten in Variablen-Namen umgerechnet:

id('IV', $blockNum + 35, $pos + 1);

In dem Fall wäre das dann IV36 bis IV39.

> nein, bisher stehen die Variablen nicht in der Liste.

Prüfen Sie bitte, dass Sie 4 interne Variablen haben (z.B. mit den Kennung IV36 bis IV39) und dass jede dieser Fragen die passende Anzahl von 7 Items (Variabeln) enthält, um die Auswahlentscheidungen abzuspeichern.
by s137634 (700 points)
Ich habe noch einmal als "Antwort" kommentiert, weil ich Ihnen dort Screenshots bereitstellen kann.
0 votes
by s137634 (700 points)

Vielen dank für Ihre rasche Rückmeldung!
Ich habe die Änderung übernommen. Die Debug-Option wird nun wie folgt angezeigt:
(die 7 steht tatsächlich dort)


Und zu den internen Variablen: Ja, sie sind angelegt. Auch hier noch einmal ein Screenshot dazu, wie sie links oben in der Leiste erscheinen:

Deswegen bin ich weiterhin verwirrt, warum das Programm sie nicht erkennt. Muss ich die Variablen irgendwo im Code noch erwähnen?

by SoSci Survey (304k points)
Okay, fangen wir mal mit der 7 an. Wenn Sie folgendes ergänzen:

debug(valueList('IV13'));

Was wir denn dafür angezeigt?

Und was die internen Variablen angeht: Prüfen Sie bitte nochmal, dass als Fragetyp auch sicher "Interne Variablen" ausgewählt ist. Wenn das der Fall ist, prüfen Sie bitte nochmal in der "Variablen-Übersicht", was zu IV36 ff. dort genau steht.
by s137634 (700 points)
edited by s137634
Nun wird folgendes angezeigt:
(Ich habe diesen Befehl unter den anderen Debug-Befehl geschrieben)

Hinweis (Seite 48)
Debug-Information für $blocks:
3 0, 2 1, 1 2, 4 3, 7

(hier wieder die 3, 2, 1, 4, in grau und klein)

Hinweis (Seite 48)
Debug-Information für valueList('IV13'):
IV13_01 3, IV13_02 2, IV13_03 1, IV13_04 4, IV13_05, IV13_06, IV13_07, IV13_08
(hier wieder alles außer nach den ersten vier Fragekennungen die 3, 2, 4 und 1 in grau und klein)

Und tatsächlich hatte ich ausversehen den falschen Fragentyp ausgewählt!

Vielen Dank!

Edit: Ich habe das Programm jetzt einmal ausprobiert und nun schreibt es auch 1 (für "ja") und -1 (für "nein") in die internen Variablen. Allerdings ist die Reihenfolge noch durcheinander. Block 1 kam an 2. Stelle, wurde aber in IV39 (also quasi in die 4. Variable) geschrieben. Block 4 kam an erster Stelle und wurde in IV38 (in die 3. Variable) geschrieben und Block 2 an 3. Stelle in IV36 und Block 3 an vierter Stelle in IV37

Und wie bekomme ich das Skript letzten Endes dazu, mit anstatt der 1 und -1 die passenden Seitenkennungen aufzuschreiben, die ich für die Auswertung brauche?
by SoSci Survey (304k points)
> Debug-Information für valueList('IV13'):
> IV13_01 3, IV13_02 2, IV13_03 1, IV13_04 4, IV13_05, IV13_06, IV13_07, IV13_08

Aha ... Sie haben zwar nur 4 Blöcke, aber 8 Variablen. Daher kommt die 7 (die Indizes im Array laufen von 0 bis 7). Das sollte einfach zu lösen sein: Geben Sie einfach an, dass Sie nur die ersten 4 Variablen haben möchten.

$blocks = array_flip(array_values(valueList('IV13', [1,2,3,4])));

> nun schreibt es auch 1 (für "ja") und -1 (für "nein")

Nicht die 1/2-Kodierung, die Sie eigentlich haben?

> Allerdings ist die Reihenfolge noch durcheinander. Block 1 kam an 2. Stelle, wurde aber in IV39 (also quasi in die 4. Variable) geschrieben.

Puh ... wie wäre es mit noch mehr Debug-Daten? Ergänzgen Sie unter der folgenden Zeile

$saveID2 = id('IV', $blockNum + 35, $pos + 1);

doch bitte einmal

debug($blocks);
debug($block);
debug($blockNum);

> anstatt der 1 und -1 die passenden Seitenkennungen aufzuschreiben, die ich für die Auswertung brauche?

Seitenkennung? Ihr ursprüngliche Frage (hier in diesem Thread) war doch, dass Sie gerne pro Block eine Liste der Entscheidungen (ja/nein) in der Reihenfolge hätten, wie die Fragen abgefragt wurden.
by s137634 (700 points)
> Aha ... Sie haben zwar nur 4 Blöcke, aber 8 Variablen. Daher kommt die 7 (die Indizes im Array laufen von 0 bis 7). Das sollte einfach zu lösen sein: Geben Sie einfach an, dass Sie nur die ersten 4 Variablen haben möchten.

Ja genau. Wo muss ich diese Zeile ergänzen bzw. ersetzen?

> Nicht die 1/2-Kodierung, die Sie eigentlich haben?
Es kann sein, dass die "-1" statt einer 2 ausgegeben wird, weil eine "nein"-Antwort durch eine Ausweichoption ausgewählt wird. das wäre dann also so kodiert wie in der ursprünglichen Frage. Entschuldigung, falls ich mich dort missverständlich ausgedrückt habe.

> Puh ... wie wäre es mit noch mehr Debug-Daten? Ergänzgen Sie unter der folgenden Zeile

Das werde ich gleich ausprobieren und hier ergänzen.

> Seitenkennung? Ihr ursprüngliche Frage (hier in diesem Thread) war doch, dass Sie gerne pro Block eine Liste der Entscheidungen (ja/nein) in der Reihenfolge hätten, wie die Fragen abgefragt wurden.

Okay... wenn wir hier aneinander vorbei geredet haben/ ich mich missverständlich ausgedrückt habe, dann tut mir das ebenfalls sehr Leid! Ich hatte oben ja folgendes geschrieben:

"Ich hätte aber gerne, dass es eben auch Seite 1 erfasst und mir als nächstes eine 1 aufschreibt (weil das die vorletzte Antwort war) und danach auch noch die Seite 7 mit einer 7 (weil dies die erste "ja"-Antwort war). Analog soll das mit allen "ja"-Antworten passieren und dann natürlich für alle Blöcke."

Damit ist gemeint, dass das Programm mir nicht nur sagt, in welcher Reihenfolge "ja" bzw. "nein" ausgewählt wird (also z.B. durch 1 und 2/-1) sondern dann auch zuordnet, welche Fragen/ bzw. Seitenkennungen (oder zumindest deren Nummer von 1 - 7 in der ursprünglichen Reihenfolge) zu den jeweils mit "ja" beantworteten Fragen gehören. Damit ich als Ausgabe letztlich eine Liste mit pro Block max. sieben Spalten erhalte, in der alle "ja"-Antworten nacheinander hineingeschrieben werden. D.h. wenn nur drei der sieben Fragen mit "ja" beantwortet wurden, stehen da nur diese drei Antworten drin in der Reihenfolge, in der sie beantwortet wurden. Ich hoffe, dass ich das dieses Mal besser ausdrücken konnte.

Und weiterhin vielen, vielen Dank für Ihre Hilfe!
by SoSci Survey (304k points)
> Damit ist gemeint, dass das Programm mir nicht nur sagt, in welcher Reihenfolge "ja" bzw. "nein" ausgewählt wird (also z.B. durch 1 und 2/-1) sondern dann auch zuordnet, welche Fragen/ bzw. Seitenkennungen (oder zumindest deren Nummer von 1 - 7 in der ursprünglichen Reihenfolge) zu den jeweils mit "ja" beantworteten Fragen gehören.

Aber das haben Sie doch bereits in einer anderen internen Variable stehen. Das hatten wir ja ganz zu Anfang in einer anderen Frage erledigt.
by s137634 (700 points)
Sie meinen die Frage, deren Link ich oben gepostet habe? Dort wird ja nur die letzte Auswahl gespeichert und nicht die vorletzte, vor-vorletzte, etc. Wenn man das Skript auf einfachem Weg so anpassen könnte, dass alle getätigten Auswahlen entsprechend gespeichert werden, würde das mein Problem lösen.
by SoSci Survey (304k points)
Posten Sie doch bitte mal den aktuellen Stand des PHP-Codes rund um $saveID2 = id('IV99', $blockNum, $pos); ... nachdem wir da die Variable $frage haben, können wir diese auch problemlos in (noch) eine interne Variable speichern. Ich habe nur keinen Überblick, was an dieser Stelle im Code schon alles geändert wurde. Daher meine Rückfrage.
by s137634 (700 points)
Meinen Sie diesen Teil?

$fragen = [
  's1GU1' => 'SG01',
  's2GU1' => 'SG02',
  's3GU1' => 'SG03',
  's4GU1' => 'SG16',
  's5GU1' => 'SG04',
  's6GU1' => 'SG21',
  's7GU1' => 'SG22',
  's1GU2' => 'SG05',
  's2GU2' => 'SG06',
  's3GU2' => 'SG07',
  's4GU2' => 'SG08',
  's5GU2' => 'SG09',
  's6GU2' => 'SG25',
  's7GU2' => 'SG23',
  's1GU3' => 'SG10',
  's2GU3' => 'SG11',
  's3GU3' => 'SG17',
  's4GU3' => 'SG18',
  's5GU3' => 'SG19',
  's6GU3' => 'SG26',
  's7GU3' => 'SG27',
  's1GU4' => 'SG12',
  's2GU4' => 'SG13',
  's3GU4' => 'SG20',
  's4GU4' => 'SG14',
  's5GU4' => 'SG15',
  's6GU4' => 'SG28',
  's7GU4' => 'SG24',
 ];

put('IV08_01', -1);
put('IV08_02', -1);
put('IV08_03', -1);
put('IV08_04', -1);

$blocks = array_flip(array_values(valueList('IV13')));
foreach ($Seq_GUNeu as $block => $pages) {
$blockNum = $blocks[$block] + 1;
debug($blocks);
debug(valueList('IV13'));
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
$saveID2 = id('IV', $blockNum + 35, $pos + 1);
debug($blocks);
debug($block);
debug($blockNum);
    put($saveID2, value($frage));
  }
}
by SoSci Survey (304k points)
Okay, dann legen Sie doch noch 4 weitere internen Variablen-Fragen IV40 bis IV43 an und ergänzen Sie wie folgt:

    $saveID2 = id('IV', $blockNum + 35, $pos + 1);
    put($saveID2, value($frage));
    $saveID3 = id('IV', $blockNum + 39, $pos + 1);
    put($saveID3, $frage);

Was bekommen Sie dann?
by SoSci Survey (304k points)
Ich dachte aber, in dem Teil wo IV13 gespeichert wird (also weiter vorne) würde auch die Abfolge der Fragen innerhalb der Blöcke gespeichert. Ich kann mich aber täuschen.
by s137634 (700 points)
Vielen Dank!

Nun wird in die neuen internen Variablen die Reihenfolge der Fragenkennungen gespeichert. Allerdings die Reihenfolge aller und nicht nur die ausgewählten Fragen.
by SoSci Survey (304k points)
Ja - aber Sie haben ja parallel, was aus gewählt wurde. Also meines Erachtens wäre das ein Fall für die Auswertung.

Es wäre natürlich auch möglich, dass Sie nur die ausgewählten speichern. Zum Beispiel so:

    $saveID3 = id('IV', $blockNum + 39, $pos + 1);
    if (value($frage) > 0) {
      put($saveID3, $frage);
    }
by s137634 (700 points)
Vielen, lieben Dank für Ihre Zeit und Mühe! Das löst meine Frage! :)
by s137634 (700 points)
Guten Tag,

ich muss doch noch einmal nerven: Haben wir folgendes eigentlich weiter verfolgt?

->> Allerdings ist die Reihenfolge noch durcheinander. Block 1 kam an 2. Stelle, wurde aber in IV39 (also quasi in die 4. Variable) geschrieben.

Puh ... wie wäre es mit noch mehr Debug-Daten? Ergänzgen Sie unter der folgenden Zeile

$saveID2 = id('IV', $blockNum + 35, $pos + 1);

doch bitte einmal

debug($blocks);
debug($block);
debug($blockNum);

Denn noch immer schreibt das Programm die Blöcke in falscher Reihenfolge auf. Z.B. wurden die Blöcke in folgender Reihenfolge präsentiert: 2,3,1,4 aber so gespeichert: 3,1,2,4

Weiter oben (10 Posts weiter oben) fand sich die (recht lange) Debug-Information, die ich aber gerne auch nochmal posten kann. Der Code sieht im Augenblick so aus:

$blocks = array_flip(array_values(valueList('IV13')));
foreach ($Seq_GUNeu as $block => $pages) {
$blockNum = $blocks[$block] + 1;
debug($blocks);
debug(valueList('IV13'));
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
$saveID2 = id('IV', $blockNum + 35, $pos + 1);
    put($saveID2, value($frage));
 $saveID3 = id('IV', $blockNum + 39, $pos + 1);
 if (value($frage) > 0) {
    put($saveID3, $frage);
}
by SoSci Survey (304k points)
> Haben wir folgendes eigentlich weiter verfolgt?

Ähm ... ich bin nicht sicher, es gab da einige Fragen, die sich teils überlappt haben. Ich dachte, wir hätten das mit dem $saveID3 erfolgreich erledigt.

Gegenfrage: Benötigen Sie noch etwas, das noch nicht funktioniert?
by s137634 (700 points)
Vielleicht funktioniert es auch aus einem anderen Grund nicht. ich bin mir nicht sicher^^" Ich habe heute das Programm noch Mal getestet und da war die Reihenfolge der Blöcke leider immer noch falsch (s. das Beispiel oben).
by SoSci Survey (304k points)
> $blocks = array_flip(array_values(valueList('IV13')));

Da hatten wir in der anderen Frage schon eine Beschränkung auf die ersten 4 Items integriert - damit die 7 rausfliegt.
by s137634 (700 points)
Stimmt! Ich weiß nicht genau, wie das abhanden gekommen ist. Nun sieht der Code so aus:

$blocks = array_flip(array_values(valueList('IV13', [1,2,3,4])));
foreach ($Seq_GUNeu as $block => $pages) {
$blockNum = $blocks[$block] + 1;
debug($blocks);
debug(valueList('IV13'));
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
$saveID2 = id('IV', $blockNum + 35, $pos + 1);
debug($blocks);
debug($block);
debug($blockNum);
    put($saveID2, value($frage));
 $saveID3 = id('IV', $blockNum + 39, $pos + 1);
 if (value($frage) > 0) {
    put($saveID3, $frage);
}

allerdings wird die Blockreihenfolge noch immer nicht richtig gespeichert.
by s137634 (700 points)
Hier ist noch einmal eine aktualisierte Version bzw. ein Ausschnitt der Debug-Ergebnisse:

Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
Hinweis (Seite 48)
Debug-Information für valueList('IV13'):
IV13_01 1, IV13_02 4, IV13_03 2, IV13_04 3, IV13_05, IV13_06, IV13_07, IV13_08
Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blocks:
1 0, 4 1, 2 2, 3 3
by SoSci Survey (304k points)
Also was definitiv ein Problem ist, dass sich diese Zeile nicht ändert:

$block = 1 (integer)

Ich habe den Code mal korrekt eingerückt und die debug()s an die richtige Stelle gesetzt. Außerdem fehlten da min. zwei geschweifte Klammern. Können Sie es so nochmal laufen lassen:

$blocks = array_flip(array_values(valueList('IV13', [1,2,3,4])));
debug(valueList('IV13'));
debug($blocks);
foreach ($Seq_GUNeu as $block => $pages) {
  $blockNum = $blocks[$block] + 1;
  debug($block);
  debug($blockNum);
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV08', $block);
      put($saveID, $pageID);
    }
    $saveID2 = id('IV', $blockNum + 35, $pos + 1);
    put($saveID2, value($frage));
    $saveID3 = id('IV', $blockNum + 39, $pos + 1);
    if (value($frage) > 0) {
      put($saveID3, $frage);
    }
  }
}

Achten Sie bitte auch darauf, dass "außernherum" keine weiteren Schleifen sind, welche diesen Code mehrfach ausführen würden.
by s137634 (700 points)
Ich habe das obere Skript übernommen und zwei Testdurchläufe gemacht. Beim ersten wurde die Reihenfolge richtig aufgeschrieben. Bei zweiten Durchlauf allerdings nicht. Ich habe von beiden Durchgängen die Debug-Skripte angehängt:

Durchlauf 1:
Hinweis (Seite 48)
Debug-Information für valueList('IV13'):
IV13_013, IV13_024, IV13_031, IV13_042, IV13_05, IV13_06, IV13_07, IV13_08
Hinweis (Seite 48)
Debug-Information für $blocks:
30, 41, 12, 23
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 3 (integer)
Hinweis (Seite 48)
Debug-Information für $block:
$block = 2 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 4 (integer)
Hinweis (Seite 48)
Debug-Information für $block:
$block = 3 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $block:
$block = 4 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 2 (integer)

Durchlauf 2:
Hinweis (Seite 48)
Debug-Information für valueList('IV13'):
IV13_013, IV13_021, IV13_032, IV13_044, IV13_05, IV13_06, IV13_07, IV13_08
Hinweis (Seite 48)
Debug-Information für $blocks:
30, 11, 22, 43
Hinweis (Seite 48)
Debug-Information für $block:
$block = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 2 (integer)
Hinweis (Seite 48)
Debug-Information für $block:
$block = 2 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 3 (integer)
Hinweis (Seite 48)
Debug-Information für $block:
$block = 3 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 1 (integer)
Hinweis (Seite 48)
Debug-Information für $block:
$block = 4 (integer)
Hinweis (Seite 48)
Debug-Information für $blockNum:
$blockNum = 4 (integer)
by SoSci Survey (304k points)
Mit "Reihenfolge nicht richtig aufgeschrieben" meinen Sie das, was in IV39 ff. steht? Oder das in IV35 ff.? Der etwas ganz anderes?
by s137634 (700 points)
In IV40 bis IV43 sollen die vier Blöcke der Reihe nach hinein geschrieben werden. Dort wird aber z.B. wenn die Blöcke in Reihenfolge 2, 3, 1, 4 vorliegen die Werte in der Reihenfolge 1, 4, 2, 3 geschrieben.
by SoSci Survey (304k points)
Was steht denn in diesem Fall in IV13_* ?
by s137634 (700 points)
Ich habe drei Testdurchgänge gemacht:

Beim ersten passten die Variablen mit der Reihenfolge in der Studie zusammen:
3, 4, 1, 2 wurden in IV40 - IV43 als 3, 4, 1, 2 angezeigt. In IV13_01 - 13_04 ebenfalls 3, 4, 1, 2

Anders sah es im zweiten Durchgang aus. Da war die Reihen folge in der Studie 3, 2, 4, 1 aber sowohl in IV40 - IV43 und IV 13_01 - IV13_04 4, 2, 1, 3

Im dritten Durchgang zeigte sich das ebenso: Die Reihenfolge in der Studie war 1, 4, 2, 3 aber in allen Variablen als 1, 3, 4, 2 gespeichert
by SoSci Survey (304k points)
Sie haben in der Variable die Ränge (!) der Blöcke gespeichert:

1, 4, 2, 3 bedeutet:

Block 1 wurde auf Position 1 gezeigt
Block 2 wurde auf Position 3 gezeigt
Block 3 wurde auf Position 4 gezeigt
Block 4 wurde auf Position 2 gezeigt

Daher die Daten in Ihrem Datensatz.

Aber ich dachte eigentlich, dass in IV40 ff. die Abfolgen innerhalb der Blöcke gespeichert würden bzw. die Frage-Kennungen (und zwar nur dann wenn die positive Auswahl mit Code 1 gewähl wurde):

    $saveID3 = id('IV', $blockNum + 39, $pos + 1);
    if (value($frage) > 0) {
      put($saveID3, $frage);
    }

Und in IV13 dachte ich, dass die Reihenfolge der Blöcke liegt. Sie sehen, ich mache mir gerade Sorgen, dass Sie Ihre Variablen überschreiben und am Ende ein großes Chaos in den Daten bekommen.
by s137634 (700 points)
Ja, das könnte vielleicht passieren. Da ich viele Berechnungen zur Auswertung bereits in Sosci Survey durchführe gibt es eine ganze Reihe an Variablen und Code. Wie kann ich das Problem denn umgehen?

Sollte neben IV13 eine weitere variable angelegt werden, die die Reihenfolge speichert, so wie ich sie in IV40 ff. brauche? in IV40 ff. soll nämlich die Reihenfolge und nicht die Rangfolge gespeichert werden. Wobei wenn es dadurch sehr aufwändig wird könnte ich mit meinem Auswertungsprogramm da vermutlich auch eine Lösung finden.
by SoSci Survey (304k points)
> Wie kann ich das Problem denn umgehen?

Vielleicht wäre es eine gute Idee, die internen Variablen-Fragen für unterschiedliche Einsatzbereiche in unterschiedliche (neue) Rubriken zu verschieben. Dann kann man ziemlich sicher ausschließen, dass eine Variable doppelt verwendet wird.

> Sollte neben IV13 eine weitere variable angelegt werden, die die Reihenfolge speichert, so wie ich sie in IV40 ff. brauche?

Das kann man schon machen. Das würde ich dann aber an derselben Stelle erledigen, wo auch IV13 beschrieben wird. Auwfändiger wird es nicht - man muss halt nur wissen, was man in der Auswertung benötigt.
by s137634 (700 points)
Guten Tag,

da ich für eine weitere Auswertung doch auch die Reihenfolge brauche, habe ich noch einmal eine Antwort zu dieser Frage gepostet, weil es bei der Etablierung noch Probleme gibt. Wenn das Skript dort funktioniert würde ich in dem bisher erarbeiteten Skript einfach die Variable IV13 gegen IV52 austauschen, dann müsste das Programm auf die dort vorliegende Reihenfolge zugreifen, oder?
0 votes
by s137634 (700 points)

Nach längerem Herumprobieren ist es doch am einfachsten, die Reihenfolge zu speichern. In der internen Variable 13 wird bisher die Position gespeichert, welche ich an anderer Stelle brauche. deswegen wollte ich die Reihenfolge in die zusätzliche Variable IV52 speichern. Dort, wo die Positionen im Code geshuffelt werden habe ich den Code zur Speicherung für Reihenfolgen ergänzt. Allerdings hat das Programm damit Probleme. Es wird folgende Fehlermeldung ausgegeben:

In der Funktion setPageOrder() wurde ein ungültiger Parameter vom Typ NULL angegeben. Als Parameter sind entweder Strings (Texte) erlaubt oder Arrays, die ausschließlich Strings enthalten.
Fehler im Fragebogen (Seite 12)
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined offset: 4
Zeile: 684

PHP-Code

681
682 put($id, $i + 1);
683
684 $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
685 }
686
687 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
Fehler im Fragebogen: Undefined index:
Zeile: 684

PHP-Code

681
682 put($id, $i + 1);
683
684 $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
685 }
686
687 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
Fehler im Fragebogen: Undefined offset: 0
Zeile: 687

PHP-Code

684 $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
685 }
686
687 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
688 }
689
690
Fehler im Fragebogen: Undefined offset: 1
Zeile: 687

PHP-Code

684 $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
685 }
686
687 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
688 }
689
690
Fehler im Fragebogen: Undefined offset: 2
Zeile: 687

PHP-Code

684 $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
685 }
686
687 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
688 }
689
690
Fehler im Fragebogen: Undefined offset: 3
Zeile: 687

PHP-Code

684 $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
685 }
686
687 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
688 }
689
690

Und der Code sieht nun wie folgt aus:
(Der von mir ergänzte Teil ist fast ganz unten über dem Debug-Block zu finden. Ohne ihn funktionierte mein Code, aber anscheinend interferiert er mit dem bisherigen?)

// Erst einmal die Seitenkennungen als Arrays speichern
$Seq_GU = array (
'Seq_GU11' => array('s1GU1', 's2GU1', 's3GU1', 
                 's4GU1', 's5GU1', 's7GU1'),

'Seq_GU21' => array('s1GU2', 's2GU2', 's3GU2', 
                 's4GU2', 's5GU2', 's7GU2'),

'Seq_GU31' => array('s1GU3', 's2GU3', 's3GU3', 
                 's4GU3', 's5GU3', 's6GU3'),

'Seq_GU41' => array('s1GU4', 's2GU4', 's3GU4', 
                 's4GU4', 's5GU4', 's6GU4')
//GU1 = blau, GU2 = orange, GU3 = grün, GU4 = violett (Dummy-Bilder)
//s1 - s5 stehen für die Distraktoren, s6 für Target 1 und s7 für Target 2
);


// Den ersten Block aus dem Array $Seq_GU herausnehmen, etc.
$Seq_GU1 = array_shift($Seq_GU);
$Seq_GU2 = array_shift($Seq_GU);
$Seq_GU3 = array_shift($Seq_GU);
$Seq_GU4 = array_shift($Seq_GU);


//Speichern der Reihenfolge von Targets und Distraktoren in einer internen Variable

$indices1 = array_keys($Seq_GU1);
shuffle($indices1);
//Reihenfolge speichern (neben Position)
for ($i=0; $i<count($indices1); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV28', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices1[$i]);
}
registerVariable('indices1');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order1 = array();
for ($i=0; $i<count($indices1); $i++) {
  // Rang speichern wie oben
  $id = id('IV01', $indices1[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order1[$i] = $Seq_GU1[$indices1[$i]];
}

$indices2 = array_keys($Seq_GU2);
shuffle($indices2);
for ($i=0; $i<count($indices2); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV29', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices2[$i]);
}
registerVariable('indices2');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order2 = array();
for ($i=0; $i<count($indices2); $i++) {
  // Rang speichern wie oben
  $id = id('IV03', $indices2[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order2[$i] = $Seq_GU2[$indices2[$i]];
}

$indices3 = array_keys($Seq_GU3);
shuffle($indices3);
for ($i=0; $i<count($indices3); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV30', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices3[$i]);
}
registerVariable('indices3');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order3 = array();
for ($i=0; $i<count($indices3); $i++) {
  // Rang speichern wie oben
  $id = id('IV04', $indices3[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order3[$i] = $Seq_GU3[$indices3[$i]];
}

$indices4 = array_keys($Seq_GU4);
shuffle($indices4);
for ($i=0; $i<count($indices4); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV31', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices4[$i]);
}
registerVariable('indices4');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order4 = array();
for ($i=0; $i<count($indices4); $i++) {
  // Rang speichern wie oben
  $id = id('IV05', $indices4[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order4[$i] = $Seq_GU4[$indices4[$i]];
}

$Seq_GUNeu = [
  1 => $Seq_GU_order1,
  2 => $Seq_GU_order2,
  3 => $Seq_GU_order3,
  4 => $Seq_GU_order4
];
registerVariable('Seq_GUNeu');

$Seq_GU_order = array (
 $Seq_GU_order1,
 $Seq_GU_order2,
 $Seq_GU_order3,
 $Seq_GU_order4
);
// Die Schlüssel mischen, nicht das Array selbst
$indicesA = array_keys($Seq_GU_order);
shuffle($indicesA);

// Jetzt wieder Positionen (der Gegenüberstellungen)
//speichern und ein gemischtes Array erzeugen
$Seq_GUMix = [];
for ($i=0; $i<count($indicesA); $i++) {
  // Rang speichern
  $id = id('IV13', $indicesA[$i] + 1);

registerVariable('Seq_GUMix');

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

debug($i);
debug($indicesA);
debug($id);
debug($indicesA[$i]);

  put($id, $i + 1);
  // Teil-Array speichern
  $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
}

setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
}
by s137634 (700 points)
Ich habe vermutlich gefunden, wo das Problem mit der Klammer war:

// Jetzt wieder Positionen (der Gegenüberstellungen)
//speichern und ein gemischtes Array erzeugen
$Seq_GUMix = [];
for ($i=0; $i<count($indicesA); $i++) {
  // Rang speichern
  $id = id('IV13', $indicesA[$i] + 1);
}
registerVariable('Seq_GUMix');
debug($Seq_GUMix);

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

  put($id, $i + 1);
  // Teil-Array speichern
  $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];

} // <- Diese Klammer habe ich gelöscht, nun gibt es keine Fehlermeldung mehr

setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
}

Nun wird mir allerdings folgendes angezeigt:

Hinweis (Seite 12)
Debug-Information für $Seq_GUMix:
Array (ohne Elemente)
Fehler im Fragebogen (Seite 12)
In der Funktion setPageOrder() wurde ein ungültiger Parameter vom Typ NULL angegeben. Als Parameter sind entweder Strings (Texte) erlaubt oder Arrays, die ausschließlich Strings enthalten.
Fehler im Fragebogen (Seite 12)
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined offset: 4
Zeile: 359

PHP-Code

356
357   put($id, $i + 1);
358   
359   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
360
361
362 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
Fehler im Fragebogen: Undefined index:
Zeile: 359

PHP-Code

356
357   put($id, $i + 1);
358   
359   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
360
361
362 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
Fehler im Fragebogen: Undefined offset: 0
Zeile: 362

PHP-Code

359   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
360
361
362 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
363 }
364
365
Fehler im Fragebogen: Undefined offset: 1
Zeile: 362

PHP-Code

359   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
360
361
362 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
363 }
364
365
Fehler im Fragebogen: Undefined offset: 2
Zeile: 362

PHP-Code

359   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
360
361
362 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
363 }
364
365
Fehler im Fragebogen: Undefined offset: 3
Zeile: 362

PHP-Code

359   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
360
361
362 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
363 }
364
365
by SoSci Survey (304k points)
Sie können den Code hier mal richtig einrücken lassen, dann sollte es übersichtlicher werden: http://beautifytools.com/php-beautifier.php
by SoSci Survey (304k points)
> Diese Klammer habe ich gelöscht, nun gibt es keine Fehlermeldung mehr

Das war m.E. die falsche - es macht nicht viel Sinn, setPageOrder() in einer Schleife mehrfach aufzurufen. Diese Funktion sollte definitiv nur einmal aufgerufen werden. Und dann natürlich mit den richtigen Werten, sonst kommt eine Fehlermeldung wie die beschriebene ;)
by s137634 (700 points)
Vielen Dank für den Link!
Ich habe den Code nun so abgeändert, dass es nur noch ein einziges setPageOrder() am Ende außerhalb der Schleifen gibt. Ich habe die vorherige Klammer zudem wieder ergänzt. Das ganze sieht nun so aus:

else {

if (
(value ('RA02') == 1)) {

// Erst einmal die Seitenkennungen als Arrays speichern
$Seq_GU = array (
'Seq_GU11' => array('s1GU1', 's2GU1', 's3GU1',
                 's4GU1', 's5GU1', 's7GU1'),

'Seq_GU21' => array('s1GU2', 's2GU2', 's3GU2',
                 's4GU2', 's5GU2', 's7GU2'),

'Seq_GU31' => array('s1GU3', 's2GU3', 's3GU3',
                 's4GU3', 's5GU3', 's6GU3'),

'Seq_GU41' => array('s1GU4', 's2GU4', 's3GU4',
                 's4GU4', 's5GU4', 's6GU4')
//GU1 = blau, GU2 = orange, GU3 = grün, GU4 = violett (Dummy-Bilder)
//s1 - s5 stehen für die Distraktoren, s6 für Target 1 und s7 für Target 2
);


// Den ersten Block aus dem Array $Seq_GU herausnehmen, etc.
$Seq_GU1 = array_shift($Seq_GU);
$Seq_GU2 = array_shift($Seq_GU);
$Seq_GU3 = array_shift($Seq_GU);
$Seq_GU4 = array_shift($Seq_GU);


//Speichern der Reihenfolge von Targets und Distraktoren in einer internen Variable

$indices1 = array_keys($Seq_GU1);
shuffle($indices1);
//Reihenfolge speichern (neben Position)
for ($i=0; $i<count($indices1); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV28', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices1[$i]);
}
registerVariable('indices1');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order1 = array();
for ($i=0; $i<count($indices1); $i++) {
  // Rang speichern wie oben
  $id = id('IV01', $indices1[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order1[$i] = $Seq_GU1[$indices1[$i]];
}

$indices2 = array_keys($Seq_GU2);
shuffle($indices2);
for ($i=0; $i<count($indices2); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV29', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices2[$i]);
}
registerVariable('indices2');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order2 = array();
for ($i=0; $i<count($indices2); $i++) {
  // Rang speichern wie oben
  $id = id('IV03', $indices2[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order2[$i] = $Seq_GU2[$indices2[$i]];
}

$indices3 = array_keys($Seq_GU3);
shuffle($indices3);
for ($i=0; $i<count($indices3); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV30', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices3[$i]);
}
registerVariable('indices3');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order3 = array();
for ($i=0; $i<count($indices3); $i++) {
  // Rang speichern wie oben
  $id = id('IV04', $indices3[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order3[$i] = $Seq_GU3[$indices3[$i]];
}

$indices4 = array_keys($Seq_GU4);
shuffle($indices4);
for ($i=0; $i<count($indices4); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV31', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $indices4[$i]);
}
registerVariable('indices4');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Seq_GU_order speichern
$Seq_GU_order4 = array();
for ($i=0; $i<count($indices4); $i++) {
  // Rang speichern wie oben
  $id = id('IV05', $indices4[$i] + 1);
  put($id, $i + 1);
  // Seite in der Abfolge speichern
  $Seq_GU_order4[$i] = $Seq_GU4[$indices4[$i]];
}

$Seq_GUNeu = [
  1 => $Seq_GU_order1,
  2 => $Seq_GU_order2,
  3 => $Seq_GU_order3,
  4 => $Seq_GU_order4
];
registerVariable('Seq_GUNeu');

$Seq_GU_order = array (
 $Seq_GU_order1,
 $Seq_GU_order2,
 $Seq_GU_order3,
 $Seq_GU_order4
);
// Die Schlüssel mischen, nicht das Array selbst
$indicesA = array_keys($Seq_GU_order);
shuffle($indicesA);

// Jetzt wieder Positionen (der Gegenüberstellungen)
//speichern und ein gemischtes Array erzeugen
$Seq_GUMix = [];
for ($i=0; $i<count($indicesA); $i++) {
  // Rang speichern
  $id = id('IV13', $indicesA[$i] + 1);
}
registerVariable('Seq_GUMix');
debug($Seq_GUMix);

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

  put($id, $i + 1);
  // Teil-Array speichern
  $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
}

(hier folgen dann fünf weitere, sehr ähnliche Blöcke)

setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );

;}


Allerdings ist auch das problematisch:

Hinweis (Seite 12)
Debug-Information für $Seq_GUMix:
Array (ohne Elemente)
Fehler im Fragebogen (Seite 12)
In der Funktion setPageOrder() wurde ein ungültiger Parameter vom Typ NULL angegeben. Als Parameter sind entweder Strings (Texte) erlaubt oder Arrays, die ausschließlich Strings enthalten.
Fehler im Fragebogen (Seite 12)
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined offset: 4
Zeile: 820

PHP-Code

817
818   put($id, $i + 1);
819   
820   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
821
822 }
823
Fehler im Fragebogen: Undefined index:
Zeile: 820

PHP-Code

817
818   put($id, $i + 1);
819   
820   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
821
822 }
823
Fehler im Fragebogen: Undefined offset: 0
Zeile: 975

PHP-Code

972   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
973 }
974
975 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
976
977 ;}
978 return 'ok';
Fehler im Fragebogen: Undefined offset: 1
Zeile: 975

PHP-Code

972   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
973 }
974
975 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
976
977 ;}
978 return 'ok';
Fehler im Fragebogen: Undefined offset: 2
Zeile: 975

PHP-Code

972   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
973 }
974
975 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
976
977 ;}
978 return 'ok';
Fehler im Fragebogen: Undefined offset: 3
Zeile: 975

PHP-Code

972   $Seq_GUMix[$i] = $Seq_GU_order[$indicesA[$i]];
973 }
974
975 setPageOrder($Seq_GUMix[0], 'S2', $Seq_GUMix[1], 'S3', $Seq_GUMix[2], 'S4', $Seq_GUMix[3], 'GK' );
976
977 ;}
978 return 'ok';


Generell hat das Programm ja so lange funktioniert, bis ich den Block

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

ergänzt habe. Interferiert dieser auf irgendeine Weise mit dem anderen Skript?
asked Nov 4, 2020 in SoSci Survey (dt.) by s137634 (700 points)
closed Nov 4, 2020 by SoSci Survey
Reihenfolge und Position einer Frage speichern

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

...