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

Guten Tag,

für meinen Fragebogen wollte ich für die Auswertung in eine interne Variable speichern, welches Item ein Teilnehmer zuletzt erkannt und mit "ja" beantwortet hat.
In der Studie bekommt der Teilnehmer sechs Seiten mit jeweils einer Frage präsentiert. Die Fragen lassen sich jeweils mit "ja" (1) oder der Ausweichoption "nein" (-1) beantworten. Die Reihenfolge der Seiten wird durch ein Array und mithilfe von shuffle randomisiert. Ich habe mich an dieser Seite hier orientiert

https://www.soscisurvey.de/help/doku.php/de:create:variables
(unter: "Variablen dauerhaft verwenden")

und nach der Randomisierung das Array mit

shuffle($indices1);
registerVariable('indices1');

für künftige PHP-Code Elemente verfügbar gemacht (das passiert auf Seite 12 des Fragebogens).

Auf Seite 48 habe ich dann den Code unten eingefügt (unten ist ein kleiner Ausschnitt davon zu sehen). Dort war meine Logik, den Befehl "array_shift" zu nutzen um nach und nach die sechs Seitenkennungen aus dem randomisierten Array zu nehmen.
Danach sollte jeweils geprüft werden, welche Seitenkennung von den sechsen vorliegt. Anhand der Seitenkennung kann das Skript dann prüfen, ob die entsprechende Frage auf der Seite mit "ja" oder "nein" beantwortet wurde und bei einem "ja" die ursprüngliche Position der Frage (1 bis 6) in eine interne Variable schreiben. Das hat den Hintergrund, dass mich nur die letzte "ja"-Antwort des Probanden interessiert und vorherige überschrieben werden dürfen. Diese hätte ich gerne für die spätere Auswertung zur Verfügung.

Allerdings wird in die interne Variable nichts hinein geschrieben. Das Programm beschwert sich auch nicht, dass Fehler im Code sind. Deswegen wäre meine Vermutung, dass es die Seitenbezeichnungen oder Variablennamen in den "if-Bedingungen" nicht richtig auslesen kann.

Mir ist zudem bewusst, dass es sicherlich einen deutlich effizienteren Weg gibt, das ganze zu programmieren, als alle möglichen Kombinationen aufzuschreiben. Mein Vorwissen im Programmieren ist aber nicht groß genug dafür.

Können Sie mir dennoch weiterhelfen?

$Showup = array (
'Showup11' => array('s1GU1', 's2GU1', 's3GU1', 
                 's4GU1', 's5GU1', 's7GU1'),

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

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

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


// Den ersten Block aus dem Array $Showup herausnehmen, etc.
$Showup1 = array_shift($Showup);
$Showup2 = array_shift($Showup);
$Showup3 = array_shift($Showup);
$Showup4 = array_shift($Showup);


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

$indices1 = array_keys($Showup1);
shuffle($indices1);
registerVariable('indices1');
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $Showup_order speichern
$Showup_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
  $Showup_order1[$i] = $Showup1[$indices1[$i]];
}
$Position11 = array_shift($indices1);
$Position12 = array_shift($indices1);
$Position13 = array_shift($indices1);
$Position14 = array_shift($indices1);
$Position15 = array_shift($indices1);
$Position16 = array_shift($indices1);


//Position 11

if (
($Position11) == 's1GU1')
{
if (
(value('SG01') == 1)) { 
put('IV08_01', 1);
}
}

elseif (
($Position11) == 's2GU1')
{
if (
(value('SG02') == 1)) { 
put('IV08_01', 2);
}
}

elseif (
($Position11) == 's3GU1')
{
if (
(value('SG03') == 1)) { 
put('IV08_01', 3);
}
}

elseif (
($Position11) == 's4GU1')
{
if (
(value('SG16') == 1)) { 
put('IV08_01', 4);
}
}

elseif (
($Position11) == 's5GU1')
{
if (
(value('SG04') == 1)) { 
put('IV08_01', 5);
}
}

elseif (
($Position11) == 's6GU1')
{
if (
(value('SG21') == 1)) { 
put('IV08_01', 6);
}
}

Das würde jetzt für die anderen 5 Elemente des Arrays (Position12 - Position16) entsprechend wiederholt werden.

by SoSci Survey (306k points)
Könnten Sie in Ihrem PHP-Code bitte noch die Stelle ergänzen, wo die Variable $indices1 definiert wird? Ich kann im Moment nämlich nicht ganz nachvollziehen, wo die Seitekennungen in den Daten versteckt sind.

> Mir ist zudem bewusst, dass es sicherlich einen deutlich effizienteren Weg gibt, das ganze zu programmieren

Was Sie suchen ist eine FOR-Schleife bzw. deren Variable FOREACH. Das ist auf jeden Fall einen Blick wert. Zumal damit nicht nur die Länge des Codes dramatisch sind, sondern auch das Risiko für Fehler ... und natürlich der Zeitaufwand, wenn man etwas ändern muss.
by s137634 (700 points)
Ich habe oben den Teil des Codes ergänzt und hoffe, dass Ihnen das weiterhilft?

>Was Sie suchen ist eine FOR-Schleife bzw. deren Variable FOREACH. Das ist auf jeden Fall einen Blick wert. Zumal damit nicht nur die Länge des Codes dramatisch sind, sondern auch das Risiko für Fehler ... und natürlich der Zeitaufwand, wenn man etwas ändern muss.

Vielen Dank, das werde ich mir ansehen!

Liebe Grüße!
by SoSci Survey (306k points)
Danke für die Ergänzung.

Eigentlich speichert die FOR-Schleife die Information, an welcher Position welcher Stimulus kommt, doch eigentlich bereits in der internen Variable IV01.

Ich befürchte, ich habe noch nicht ganz das Ziel verstanden, das Sie mit dem zusätzlichen Code verfolgen.

Aber ich kann vielleicht einen Tipp zu Arrays und Schleifen geben:

$Position11 = array_shift($indices1);
$Position12 = array_shift($indices1);
$Position13 = array_shift($indices1);

Stattdessen können Sie auch schreiben

$Position1 = [];
$Position1[0] = $indices1[0];
$Position1[1] = $indices1[1];
$Position1[2] = $indices1[2];

Die Variable $Position1 braucht man jetzt natürlich gar nicht, denn man kann ja auch direkt mit $indices1[0] etc. arbeiten.

Das hat nicht zuletzt den Vorteil, dass Sie an $indices nichts ändern. Aber es macht auch den folgenden Code einfacher. Da muss man dann nicht mit zig Variablen hantieren, sondern kann einfach die Zahl in der eckigen Klammer austauschen.
by s137634 (700 points)
Ja, das stimmt. Die Position wird auch in der Variablen IV01 gespeichert. Allerdings erst einmal nur die Position an sich - unabhängig von der Auswahl der Probanden. Mit dem neuen Code möchte ich festhalten, welches der Items als letztes mit einem "ja" (also "1") beantwortet wurden. Das lässt sich anhand der Antwort auf die Frage und der Position der einzelnen Seiten natürlich auch so aus dem Datensatz lesen. Ich hätte diese integrierte Information aber gerne noch einmal separat in einer Variablen gespeichert, damit man auf dem ersten Blick sieht, welches Item pro Durchgang als letztes mit einem "ja" beantwortet wurde. Dann muss man das nicht nachträglich händisch bestimmen.

Dafür ist der Code gedacht - aber obwohl eben keine Fehlermeldung ausgegeben wird, wird in die interne Variable nichts gespeichert, selbst wenn eine (oder mehrere) Fragen mit "ja" beantwortet wurden. Und da es keine Fehlermeldung gibt, verstehe ich auch nicht, was ich verändern muss, damit es funktioniert. Ihre Vorschläge, den Code effizienter zu machen, werde ich im Rahmen meiner Fähigkeiten versuchen umzusetzen - ich bin mir aber noch nicht sicher, ob das das  jetzige Problem löst.

1 Answer

0 votes
by SoSci Survey (306k points)

Mit dem neuen Code möchte ich festhalten, welches der Items als letztes mit einem "ja" (also "1") beantwortet wurden.

Ich würde das - ehrlich gesagt - so machen, dass am Ende einfach ein kleines PHP-Script diese Information heraussucht und speichert. Dafür können Sie direkt ihr rotiertes Array verwenden.

Sie haben doch laut diesem Tread ein Array $ShowupMix, welches die Reihenfolge der Darstellung speichert. Sorgen Sie mittels registerVariable() bitte dafür, dass Sie darauf auch am Ende des Fragebogens zugreifen können.

Was jetzt noch fehlt ist, dass Sie zu jeder Seite die relevante Frage-Kennung wissen. So etwas können Sie aber vermutlich einfach in einem Array ablegen.

Und dann einfach ... wenn Ihre Variable für das letzte "Ja" z.B. die Kennung IV20_01 hat ...

// Liste, welche Frage auf welcher Seite steht
$fragen = [
  's1GU1' => 'AB01',
  's2GU1' => 'AB02',
  's3GU1' => 'AB02',
  // u.s.w.
];

foreach ($ShowupMix as $block => $pages) {
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      put('IV20_01', $block + 1);
      put('IV20_02', $pos + 1);
    }
  }
}

Dann hätten Sie in IV20_01 die Nummer des Blocks, in welchem die Frage angezeigt wurde, die zuletzt mit 1 beantwortet wurde und in IV20_02 die Nummer der Frage. Jeweils in Anzeigereihenfolge, also nicht die tatsächliche Frage. Auch diese könnten Sie natürlich noch speichern.

by s137634 (700 points)
Vielen, lieben Dank für Ihre Antwort!
Das geht schon einmal in die richtige Richtung (und ist deutlich effizienter, als ich das hätte formulieren können! :))

Allerdings (das habe ich vorher nicht gut kommuniziert) benötige ich pro Block jeweils die letzte "ja"-Auswahl. Im Idealfall würde die Auswahl des ersten Blocks (und zwar der erste, bevor er durch "shuffle" randomisiert wurde, nicht der an der ersten Position) in die Variable IV08 gespeichert werden, der zweite in IV09 etc.

Zudem wäre es wichtig, die tatsächliche Fragekennung abzuspeichern (bzw. auch hier die ursprüngliche Position, bevor die Fragen randomisiert wurden). Die neue Position alleine bringt mir bei der Auswertung der Frage leider keinen großen Vorteil.

Da ich leider nicht genug Ahnung vom Programmieren habe um das in dem Rahmen wie oben zu implementieren: Können Sie mir da weiterhelfen?
by SoSci Survey (306k points)
>  pro Block jeweils die letzte "ja"-Auswahl.

Kein Problem ;) Speichern Sie einfach pro Block in eine andere Variable. Hier IV20_01 bis IV20_06. Und damit es im richtigen Block gespeichert wird noch mal Ihre Variablen...

$ShowupNeu = [
  1 => $Showup1,
  2 => $Showup2,
  3 => $Showup3,
  // u.s.w.
];

foreach ($ShowupNeu as $block => $pages) {
  foreach ($pages as $pos => $pageID) {
    $frage = $fragen[$pageID];
    if (value($frage) == 1) {
      $saveID = id('IV20', $block);
      put($saveID, $pos + 1);
    }
  }
}
by s137634 (700 points)
Vielen Dank für Ihre Antwort! Ich habe das ganze jetzt wie folgt umgesetzt:

if( (value('RA01') == 5) or  //simultan hat die Werte 1 - 4
    (value('RA01') == 6) or  //sequentiell 5 - 8
    (value('RA01') == 7) or
    (value('RA01') == 8)
)  {

// Liste, welche Frage auf welcher Seite steht
$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',
 ];

$ShowupNeu = [
  1 => $Showup1,
  2 => $Showup2,
  3 => $Showup3,
  4 => $Showup4,
];

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

Allerdings wird mir nun folgende Fehlermeldung ausgegeben:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Die PHP-Variable $Showup1 wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

039  ];
040
041 $ShowupNeu = [
042   1 => $Showup1,
043   2 => $Showup2,
044   3 => $Showup3,
045   4 => $Showup4,
Fehler im Fragebogen: Die PHP-Variable $Showup2 wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

040
041 $ShowupNeu = [
042   1 => $Showup1,
043   2 => $Showup2,
044   3 => $Showup3,
045   4 => $Showup4,
046 ];
Fehler im Fragebogen: Die PHP-Variable $Showup3 wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

041 $ShowupNeu = [
042   1 => $Showup1,
043   2 => $Showup2,
044   3 => $Showup3,
045   4 => $Showup4,
046 ];
047
Fehler im Fragebogen: Die PHP-Variable $Showup4 wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

042   1 => $Showup1,
043   2 => $Showup2,
044   3 => $Showup3,
045   4 => $Showup4,
046 ];
047
048 foreach ($ShowupNeu as $block => $pages) {
Fehler im Fragebogen: Invalid argument supplied for foreach()
Zeile: 49

PHP-Code

046 ];
047
048 foreach ($ShowupNeu as $block => $pages) {
049   foreach ($pages as $pos => $pageID) {
050     $frage = $fragen[$pageID];
051     if (value($frage) == 1) {
052       $saveID = id('IV08', $block);
Fehler im Fragebogen: Invalid argument supplied for foreach()
Zeile: 49

PHP-Code

046 ];
047
048 foreach ($ShowupNeu as $block => $pages) {
049   foreach ($pages as $pos => $pageID) {
050     $frage = $fragen[$pageID];
051     if (value($frage) == 1) {
052       $saveID = id('IV08', $block);
Fehler im Fragebogen: Invalid argument supplied for foreach()
Zeile: 49

PHP-Code

046 ];
047
048 foreach ($ShowupNeu as $block => $pages) {
049   foreach ($pages as $pos => $pageID) {
050     $frage = $fragen[$pageID];
051     if (value($frage) == 1) {
052       $saveID = id('IV08', $block);
Fehler im Fragebogen: Invalid argument supplied for foreach()
Zeile: 49

PHP-Code

046 ];
047
048 foreach ($ShowupNeu as $block => $pages) {
049   foreach ($pages as $pos => $pageID) {
050     $frage = $fragen[$pageID];
051     if (value($frage) == 1) {
052       $saveID = id('IV08', $block);
by SoSci Survey (306k points)
> Die PHP-Variable $Showup1 wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

Bitte setzen Sie den PHP-Code in denselben Block, in welchem Sie auch $Showup1 und die anderen Variablen definieren. Ich hatte den Variablennamen aus Ihrem anderen (verlinkten) Post übernommen.
by s137634 (700 points)
Guter Punkt! Ich habe das abgeändert und nun gibt es keine Fehlermeldung mehr. Der Code speichert allerdings auch noch nicht genau das, was ich brauche:
Die Fragen haben ja alle eine feste Benennung (1 - 6), werden aber durch "shuffle" in eine gemischte Reihenfolge gebracht. D.h. sie könnten z.B. wie folgt präsentiert werden:

2, 6, 1, 3, 5, 4

Wenn ich nun bei Frage 6 (auf Position 2) und bei Frage 3 (auf Position 4) mit "ja" antworte, möchte ich, dass meine letzte Auswahl - also in diesem Fall die 3 gespeichert wird. Im Augenblick speichert das Skript aber die 6, weil es in der ursprünglichen Reihenfolge die "letzte" Frage wäre. D.h. der Code muss die jeweils neu ausgewürfelte Reihenfolge berücksichtigen.
by SoSci Survey (306k points)
>  Im Augenblick speichert das Skript aber die 6, weil es in der ursprünglichen Reihenfolge die "letzte" Frage wäre.

Die Reihenfolge, in welcher geprüft wird, ergibt sich aus dieser Schleife:

foreach ($ShowupNeu as $block => $pages) {
  foreach ($pages as $pos => $pageID) {

Da werden einmal die Blöcke durchgegangen und darin die Seiten jedes Blocks. AIch hatte allerdings falsch in Erinnerung, ass $Showup1 u.s.w. schon die gemischte Abfolge enthalten würde. Wenn ich Ihren Code oben korrekt lesen, müssten Sie das $Showup1 bei der Definition von $ShowupNeu also gegen $Showup_order1 austauschen.
by s137634 (700 points)
Ja, das stimmt. Ich habe das Array dementsprechend angepasst. Nun sieht es so aus:

$ShowupNeu = [
  1 => $Showup_order1,
  2 => $Showup_order2,
  3 => $Showup_order3,
  4 => $Showup_order4
];
registerVariable('ShowupNeu');

(auf Seite 12)

und auf Seite 48 habe ich Ihren Code übernommen:  

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

Jetzt verstehe ich allerdings nicht mehr genau, welche Zahlen das Programm aufschreibt. Als Beispiel:
Die Reihenfolge der Fragen im ersten Block war:
3,5,2,1,4,6 und ich habe die "2" und "1" mit "ja" beantwortet. In der internen Variablen IV08 steht jetzt aber eine 4
Im zweiten Block sah es so aus:
4,2,6,3,1,5, -> "ja" bei allen. IV08_02 = 6
Im dritten so:
1,4,2,5,3,6 -> "ja" bei "1" und "4". IV08_03 = 2
Im vierten so:
1,3,5,4,6,2 -> "ja" bei "5" und "2". IV08_04 = 6

Kann es womöglich sein, dass nun die Position der letzten Auswahl gespeichert wird und nicht die Nummer der Frage?
by SoSci Survey (306k points)
> Die Reihenfolge der Fragen im ersten Block war:
3,5,2,1,4,6 und ich habe die "2" und "1" mit "ja" beantwortet. In der internen Variablen IV08 steht jetzt aber eine 4

Gespeichert wird aktuell die Position - und auf Position 4 was die 1.

Wenn Sie (genau) wissen, was Sie in der Auswertung benötigen (oben stehen ja z.B: Seiten-Kennungen statt Frage-Nummern), dann lässt sich auch das sicher gut im Code abbilden. Jetzt, wo wir schonmal so weit sind :)
by s137634 (700 points)
Okay, dann habe ich mich nicht gut ausgedrückt. Was ich dort gerne stehen hätte, wäre in dem von Ihnen übernommenen Beispiel die 1.
und äquivalent dazu:
4,2,6,3,1,5, -> "ja" bei allen. IV08_02 sollte 5 sein

1,4,2,5,3,6 -> "ja" bei "1" und "4". IV08_03 sollte 4 sein

1,3,5,4,6,2 -> "ja" bei "5" und "2". IV08_04 sollte 2 sein

Ich hoffe, das ist dieses Mal verständlicher?
by SoSci Survey (306k points)
Ich bin nicht sicher, ob Sie diese Nummern überhaupt irgendwo im Code haben, aber ersetzen Sie doch bitte mal

    put($saveID, $pos + 1);

durch

    put($saveID, $pageID);

Kommen wir der Sache damit näher?
by s137634 (700 points)
edited by s137634
Ja, jetzt wird es so ausgegeben, dass ich damit weiterarbeiten kann!
Vielen, lieben Dank für Ihre Hilfe! :)

Mir ist grade noch folgendes eingefallen: Wäre es möglich, dass das Program immer dann, wenn keine der Fragen mit "ja" beantwortet wurde, eine -1 oder "keiner", ö.ä. aufschreibt? Bisher bleibt das Feld einfach leer.
by s137634 (700 points)
Aber wenn wir grade dabei sind:
Ein anderer teil des Codes speichert auch die Kennungen - hier möchte ich das ganze aber anders herum. Es sollen die Positionen gespeichert werden. Wie müsste folgender Code dafür abgeändert werden?

for ($i=0; $i<count($order_Lineup4); $i++) {
  // Kennung der internen Variable aus Frage-Kennung plus Index erstellen
  $id = id('IV12', $i + 1);
  // Hier den Wert aus dem Array speichern
  put($id, $order_Lineup4[$i]);
}
by SoSci Survey (306k points)
> Wäre es möglich, dass das Program immer dann, wenn keine der Fragen mit "ja" beantwortet wurde, eine -1 oder "keiner", ö.ä. aufschreibt?

Kein Problem - schreiben Sie das einfach vor der foreach-Schleife mittels put() in die Variablen. Wenn irgend eine 1 vorkommt, wird es dann weiter unten überschrieben.

> Ein anderer teil des Codes speichert auch die Kennungen - hier möchte ich das ganze aber anders herum. Es sollen die Positionen gespeichert werden.

Wenn Sie (bitte in einer neuen Frage, hier unten wird es langsam unübersichtlich) den Code posten, welcher die Variable $order_Lineup4 definiert, dann kann ich auch das beantworten.
by s137634 (700 points)
Vielen Dank für Ihre Antwort!

Ich habe zudem eine neue Frage angelegt:
https://support.soscisurvey.de/?qa=22586/positionen-von-randomisierten-seiten-ausgeben

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

...