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 (305k 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 (305k 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 (305k 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 SoSci Survey (305k 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 (305k 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

...