0 votes
in SoSci Survey (dt.) by s222544 (640 points)

Hallo Support,

meine Frage baut auf dem Information Provision Experiment auf (hier dargestellt: https://support.soscisurvey.de/?qa=42714/information-provision-experiment-bedingungen-verknupfen).

Ich möchte Schieberegler auf einen bestimmten Wert setzen, habe dafür aber sehr viel PHP Code und frage mich, ob man diesen nicht kompakter gestalten kann.

EX04 ist die EG, EX05 ist die KG. SL01 sind die 3 Schieberegler, die jeweils, wenn der erste Stimul ausgewählt werden sollte, auf 76, 6 und 18 gesetzt werden sollte. Bei jedem der 36 Stimuls sollen andere Werte gesetzt werden. Aus 36 möglichen Stimuls werden den Probanden 7 zufällig ausgewählt; dabei bleibt der Proband in der ursprünglichen Gruppe - also KG bleibt KG und EG bleibt EG.

if (
  (value('EX04_01') == 1) or
  (value('EX05_01') == 1) or 
  (value('EX04_02') == 1) or
  (value('EX05_02') == 1) or 
  (value('EX04_03') == 1) or
  (value('EX05_03') == 1) or
  (value('EX04_04') == 1) or
  (value('EX05_04') == 1) or 
  (value('EX04_05') == 1) or
  (value('EX05_05') == 1) or 
  (value('EX04_06') == 1) or
  (value('EX05_06') == 1) or
  (value('EX04_07') == 1) or
  (value('EX05_07') == 1)

) {
  preset('SL01_01',76);
  preset('SL01_02',6);
  preset('SL01_03',18);

}

Diesen PHP Code müsste ich dann für alle meine 36 Stimuli wiederholen, sodass anstatt ==1, nächstes Mal ==2 erscheint usw. bis 36.

Gibt es einen einfacheren Weg?

Vielen Dank im Voraus!

1 Answer

0 votes
by SoSci Survey (327k points)

EX04 ist die EG, EX05 ist die KG.

Das irritiert mich ... normalerweise hat man eine (!) Variable für eine EInteilung in EG/KG.

Bei jedem der 36 Stimuls sollen andere Werte gesetzt werden.

Am einfachsten definieren Sie eine Liste (Array) je nach Gruppe und machen diese für die weiteren Seiten mittels registerVariable() verfügbar.

if (value('EX04') == 1) {
  $presets = [
    1 => [76, 18],
    2 => [25, 22],
    ...
    32 => [53, 43]
  ];
} else {
  $presets = [
    1 => [56, 38],
    2 => [35, 42],
    ...
    32 => [33, 33]
  ];
}
registerVariable($presets);

Sie sehen, dass ich hier in jeder Liste die 32 Einträge = 32 Zeilen für die 32 Schieberegler-Paare definiert haben. Und weil es Paare sind, eben nicht nur ein Wert, sondern jeweils ein neues Array aus zwei Werten. Die können wir nun bequem nutzen. Also für das erste Paar:

preset('SL01_01', $preset[1][0]);
preset('SL01_02', $preset[1][1]);

Für das zweite Paar dann:

preset('SL02_01', $preset[2][0]);
preset('SL02_02', $preset[2][1]);

Und so weiter. Natürlich ist das auch mit Tripeln aus Schiebereglern möglich.

by s222544 (640 points)
Vielen Dank für Ihre ausführliche Antwort!

EX03 ist der Zufallsgenerator, der über KG oder EG entscheidet, während EX04 die Stimuli der EG enthält und EX05 die Stimuli der KG beinhaltet. EX06 sind die internen Variablen.

Sollte der erste Stimul ausgewählt werden, so soll unabhängig von EG oder KG in den Schiebereglern 76, 6 und 18 angezeigt werden. Die anderen (sich unterscheidenden) Zahlenwerte für die verbleibenden 35 Stimuls sind schon definiert.

Darf ich fragen, ob sich aufgrund dieser Informationen die Vorgehensweise ändert?

Vielen Dank im Voraus!
by SoSci Survey (327k points)
Im Prinzip kann man die Kombination eines Arrays mit dem preset() auf beliebige Konstellationen anwenden. Wenn es in Ihrem Fall vom Stimulus abhängig ist, würde ich nur ein Array mit Stimulus-ID => Presets definieren. Und statt

$preset[1]

würde man dann

$preset[$stimulusID]

ziehen, wobei $stimulusID z.B. aus value('EX04x01') stammen könnte ... je nachdem, wie die Konstellation konkret aussieht.
by s222544 (640 points)
Vielen Dank!

Zu "$preset[$stimulusID]

ziehen, wobei $stimulusID z.B. aus value('EX04x01') stammen könnte ... je nachdem, wie die Konstellation konkret aussieht.":

Abhängig vom Zufallsgenerator könnte entweder EX04 oder EX05 verwendet werden, wie verwende ich die preset Funktion dann?
Soll ich dann eins duplizieren und verändern, sodass ich
$preset[$EX04_01, 76,6,18]
$preset[$EX04_02, 60,10,30] etc. habe und auch

$preset[$EX05_01, 76,6,18]
$preset[$EX05_02, 60,10,30]?

Vielen Dank!
by SoSci Survey (327k points)
Meine Empfehlung wäre, dass Sie in EX04 und EX05 gleich unterschiedliche Codes verwenden (also z.B. 1-10 in EX04 und 11-20 in EX05) und direkt an der Ziehung (die wahrscheinlich in einem IF-Filter passiert), die Ziehung direkt in eine/mehrere interne Variablen kopieren. Dann können Sie im weiteren Verlauf immer auf die internen Variablen zugreifen und müssen nicht ständig herausfinden, ob Sie jetzt EX04 oder EX05 brauchen.
by s222544 (640 points)
Vielen Dank!
Könnten Sie eventuell die unterschiedlichen Codes etwas genauer erläutern?
Für EX04 (EG Stimuli) brauche ich bspw. Codes 1-7 (weil 7 Stimuli) und genauso mit EX05 (KG Stimuli), da dann Codes 8-14 (weil wieder 7 Stimuli).

Derzeit benutze ich folgenden PHP Code:

if (value('EX03') == 1) { // EG == 1 KG ==2
  // Zufallsgenerator EG stimuli ( EX04) einbinden
  show('EX04');
  putList('EX06', array_values(valueList('EX04', NULL, 'label')));  
} else {
  // Zufallsgenerator KG stimuli einbinden
  show('EX05');
  putList('EX06', array_values(valueList('EX05', NULL, 'label')));
}
text(value('EX06_01'));

Vielen Dank!
by SoSci Survey (327k points)
> Derzeit benutze ich folgenden PHP Code

Ah, darum geht es :)

Gut, dann haben Sie die Ziehung ja schon in EX06_01 u.s.w. Das könnte dann so aussehen:

$prozente = [
 1 => [13,27,29],
 2 => [23,77,39],
 ...
 19 => [29,47,19]
];
// So, dann schauen wir mal, was wir für den Stimulus brauchen, den wir in EX06_01 haben
$code = value('EX06_01');
preset('SL01_01', $preset[$code][0]);
preset('SL01_02', $preset[$code][1]);
preset('SL01_03', $preset[$code][2]);
by s222544 (640 points)
Vielen Dank für den Code!
Habe das jezt so umgesetzt:
$prozente = [
 1 => [76,6,18],
 2 => [74,5,21],
 3 => [77,4,19],
 4 => [55,40,5],
 5 => [62,35,3],
 6 => [60,29,11],

usw.
bis 36
];

$code = value('EX06_01');
preset('SL01_01', $preset[$code][0]);
preset('SL01_02', $preset[$code][1]);
preset('SL01_03', $preset[$code][2]);

Dabei erscheinen wiederholt folgende Fehler: Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Undefined variable $preset
Zeile: 43

PHP-Code

und Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 45

Damit mein Code funktioniert, muss ich nicht $prozente in die preset Funktion einbauen?

Und welche Funktion hat das Dollarzeichen vor preset und prozente?

Vielen Dank!
by SoSci Survey (327k points)
> Undefined variable $preset

Ja, stimmt, ich habe die Variable in der letzten Antwort $prozente benannt - das muss dann unten natürlich auch stehen statt $preset.
by s222544 (640 points)
Vielen Dank,

habe jetzt $prozente im PHP Code und wollte den Code ausprobieren.

Als ersten Stimul hat der Zufallsgenerator 33_C gezogen, also Stimul 33 und KG.

Jetzt tauchen diese Fehler auf:

Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Undefined array key "33_C"
Zeile: 42

und

Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 42

Ich vermute, es liegt daran, dass der untere PHP Code nicht den gezogenen Stimul erkennt.

Wie kann ich das Problem lösen?

Vielen Dank im Voraus.
by SoSci Survey (327k points)
> Als ersten Stimul hat der Zufallsgenerator 33_C gezogen, also Stimul 33 und KG.

Ach ja, wir hatten ja dafür gesorgt, dass in der internen Variable gleich die Kennungen stehen. Dann passen Sie bitte die Definition des Arrays entsprechend an:

$prozente = [
 '01_E' => [76,6,18],
 '02_E' => [74,5,21],
 '33_C' => [77,4,19],
 ...
]
by s222544 (640 points)
Vielen Dank für die Antwort.

Ich habe jetzt

$prozente = [

1_C=> [76,6,18],
2_C=> [74,5,21],
3_C=> [77, 4, 19],
...
];
$code = value('EX06_01');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);


sowie

$prozente = [
1_T=> [76,6,18],
2_T=> [74,5,21],
3_T=> [77, 4, 19],
...

];
$code = value('EX06_01');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

Dabei tritt schon im "Fragebogen zusammenstellen" wiederholt folgender Fehler auf:
"
Warnung

Warnung: Unerwartetes Element: _C - fehlt hier vielleicht ein Semikolon (;) oder Anführungszeichen?

$prozente = [

1_C"

Wie kann ich diesen Fehler beheben?

Vielen Dank im Voraus!
by SoSci Survey (327k points)
> Warnung: Unerwartetes Element: _C - fehlt hier vielleicht ein Semikolon (;) oder Anführungszeichen?

Es scheint, dass Sie um den Array-Schlüssel herum die Anführungszeichen vergessen haben. In meiner vorigen Antwort oben stehen welche :)
by s222544 (640 points)
Vielen Dank für den Hinweis; habe jetzt Anführungszeichen gesetzt.

Im Debug Modus des Fragebogens erschien folgende Meldung:
Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Uncaught Error: Undefined constant "s2survey\questionnaire\environment\‘1_C’" in /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547) : eval()'d code:4 Stack trace: #0 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(547): eval() #1 /var/www/s2survey/html/lib/s2survey/questionnaire/php/PHPCodeExecutorQnr.php(63): s2survey\phpcode\PHPCodeExecutor->runCode() #2 /var/www/s2survey/html/inc/QuestionnairePHP.php(574): s2survey\questionnaire\php\PHPCodeExecutorQnr->runCode() #3 /var/www/s2survey/html/lib/s2survey/questionnaire/QuestionnaireElement.php(479): QuestionnairePHP->runElement() #4 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1515): s2survey\questionnaire\QuestionnaireElement->run() #5 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1434): s2survey\questionnaire\QnrPage->runContent() #6 /var/www/s2survey/html/inc/InterviewCase.php(1466): s2survey\questionnaire\QnrPage->run() #7 /var/www/s2survey/html/inc/Interviewer.php(654): InterviewCase->createQuestionnairePage() #8 /var/www/s2survey/html/inc/Interviewer.php(823): Interviewer->handleCreate() #9 /var/www/s2survey/html/inc/Interviewer.php(1967): Interviewer->handleInterview() #10 /var/www/s2survey/html/info_provision/index.php(4): Interviewer::run() #11 {main} thrown
Zeile: 4

PHP-Code

001 namespace s2survey\questionnaire\environment;
002
003 $prozente = [
004 ‘1_C’=> [76,6,18],
005 ‘2_C’=> [74,5,21],
006 ‘3_C’=> [77, 4, 19],
007 ‘4_C’ => [55,40,5],

Wie behebe ich das?

Vielen Dank im Voraus!
by SoSci Survey (327k points)
Vermutlich haben Sie den Code in Word geschrieben und kopiert?

Nehmen Sie Notepad++ oder einen anderne Editor ... Word macht aus den geraden Anführungszeichen ('1_C') typografische (‘1_C’). Das sind technisch gesehen keine Anführungszeichen mehr, man sieht den Unterschied aber nur, wenn man richtig weit hinein zoomt.
by s222544 (640 points)
Vielen Dank! Habe Ihren Vorschlag in VSC umgesetzt.

Die Schieberegler stehen auf den richtigen Werten, jedoch erscheint dieser Fehler:
Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Undefined array key "17_T"
Zeile: 42

PHP-Code

039 '36_C'=> [25,70,5]
040 ];
041 $code = value('EX06_01');
042 preset('SL01_01', $prozente[$code][0]);
043 preset('SL01_02', $prozente[$code][1]);
044 preset('SL01_03', $prozente[$code][2]);
045

Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 42

PHP-Code

039 '36_C'=> [25,70,5]
040 ];
041 $code = value('EX06_01');
042 preset('SL01_01', $prozente[$code][0]);
043 preset('SL01_02', $prozente[$code][1]);
044 preset('SL01_03', $prozente[$code][2]);
045

Fehler im Fragebogen: Undefined array key "17_T"
Zeile: 43

PHP-Code

040 ];
041 $code = value('EX06_01');
042 preset('SL01_01', $prozente[$code][0]);
043 preset('SL01_02', $prozente[$code][1]);
044 preset('SL01_03', $prozente[$code][2]);
045
046 $prozente1 = [

Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 43

PHP-Code

040 ];
041 $code = value('EX06_01');
042 preset('SL01_01', $prozente[$code][0]);
043 preset('SL01_02', $prozente[$code][1]);
044 preset('SL01_03', $prozente[$code][2]);
045
046 $prozente1 = [

Fehler im Fragebogen: Undefined array key "17_T"
Zeile: 44

PHP-Code

041 $code = value('EX06_01');
042 preset('SL01_01', $prozente[$code][0]);
043 preset('SL01_02', $prozente[$code][1]);
044 preset('SL01_03', $prozente[$code][2]);
045
046 $prozente1 = [
047 '1_T'=> [76,6,18],

Fehler im Fragebogen: Trying to access array offset on value of type null
Zeile: 44

PHP-Code

041 $code = value('EX06_01');
042 preset('SL01_01', $prozente[$code][0]);
043 preset('SL01_02', $prozente[$code][1]);
044 preset('SL01_03', $prozente[$code][2]);
045
046 $prozente1 = [
047 '1_T'=> [76,6,18],

17_T wurde gerade als erstes vom Zufallsgenerator gezogen..

Warum erscheint die Fehlermeldung, wenn die Regler den richtigen Wert anzeigen?

Vielen Dank!
by SoSci Survey (327k points)
> Fehler im Fragebogen: Undefined array key "17_T"

Wenn ich es richtig sehe, dann verwenden sie das preset() einmal bevor und einmal nachdem Sie das Array mit den Pretests definiert haben. Beim ersten Mal ist dieses Array noch nicht definiert, daher die Fehlermeldungen.

Die richtige Reihenfolge ist

1. Code auslesen und Array definieren
2. preset()-Befehle verwenden, welche auf das Array zugreifen

Wenn das $prozente schon weiter oben definiert wird, dann prüfen sie bitte, ob dort ein Eintrag für "17_T" vorliegt. Ach ja ... Sie scheinen zwei Arrays $prozente und $prozente1 zu definieren. Das ist evtl. falsch und alle Einträge müssen evtl. in ein gemeinsames Array. Da ich Ihren kompletten Code aber nicht kenne, kann ich hier nur spekulieren.
by s222544 (640 points)
Vielen Dank für Ihre Antwort.

Habe jetzt nur noch ein Array in dem beide _C und _T definiert sind. Darunter die preset Funktionen.

$prozente = [
'1_C'=> [76,6,18],
'2_C'=> [74,5,21],
'3_C'=> [77, 4, 19],
'4_C' => [55,40,5],
'5_C'=> [62,35,3],
'6_C'=> [60,29,11],
'7_C'=> [5,51,44],
'8_C'=> [4,62,34],
'9_C'=> [2,65,33],
'10_C'=> [0,96,4],
'11_C'=> [1,93,6],
'12_C'=> [18,75,7],
'13_C'=> [86,6,8],
'14_C'=> [80,5,15],
'15_C'=> [83,8,9],
'16_C'=> [55,42,3],
'17_C'=> [50,30,20],
'18_C'=> [51,34,15],
'19_C'=> [3,65,32],
'20_C'=> [4,77,19],
'21_C'=> [1,79,20],
'22_C'=> [4,70,26],
'23_C'=> [2,89,9],
'24_C'=> [3,92,5],
'25_C'=> [92,3,5],
'26_C'=> [95,4,1],
'27_C'=> [94,2,4],
'28_C'=> [72,12,16],
'29_C'=> [71,8,21],
'30_C'=> [75,5,20],
'31_C'=> [5,75,20],
'32_C'=> [0,86,14],
'33_C'=> [0,91,9],
'34_C'=> [0,70,30],
'35_C'=> [5,95,0],
'36_C'=> [25,70,5],
'1_C'=> [76,6,18],
'2_C'=> [74,5,21],
'3_C'=> [77, 4, 19],
'4_C' => [55,40,5],
'5_C'=> [62,35,3],
'6_C'=> [60,29,11],
'7_C'=> [5,51,44],
'8_C'=> [4,62,34],
'9_C'=> [2,65,33],
'10_C'=> [0,96,4],
'11_C'=> [1,93,6],
'12_C'=> [18,75,7],
'13_C'=> [86,6,8],
'14_C'=> [80,5,15],
'15_C'=> [83,8,9],
'16_C'=> [55,42,3],
'17_C'=> [50,30,20],
'18_C'=> [51,34,15],
'19_C'=> [3,65,32],
'20_C'=> [4,77,19],
'21_C'=> [1,79,20],
'22_C'=> [4,70,26],
'23_C'=> [2,89,9],
'24_C'=> [3,92,5],
'25_C'=> [92,3,5],
'26_C'=> [95,4,1],
'27_C'=> [94,2,4],
'28_C'=> [72,12,16],
'29_C'=> [71,8,21],
'30_C'=> [75,5,20],
'31_C'=> [5,75,20],
'32_C'=> [0,86,14],
'33_C'=> [0,91,9],
'34_C'=> [0,70,30],
'35_C'=> [5,95,0],
'36_C'=> [25,70,5]
];

$code = value('EX06_01');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

$code = value('EX06_02');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

$code = value('EX06_03');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

$code = value('EX06_04');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

$code = value('EX06_05');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

$code = value('EX06_06');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

$code = value('EX06_07');
preset('SL01_01', $prozente[$code][0]);
preset('SL01_02', $prozente[$code][1]);
preset('SL01_03', $prozente[$code][2]);

Bei den heruntergeladenen Daten wird in der Spalte EX06_01, _02, _03 usw. 36_C, 27_T, 27_C etc. angezeigt.

Die Zufallsgeneratoren haben als Werte auch 1_C bis 36_C und 1_T bis 36_T.

Zwar erscheinen jetzt im ersten Stimul Zahlen im Schieberegler, jedoch sind es die Falschen... Im Array prozente sind die Zahlen richtig hinterlegt.
Alle anderen Stimuls waren leer, d.h. keine Zahlen waren vorher eingegeben, obwohl ich das im preset definiert habe.

Muss ich noch einen Array anlegen, der den Schieberegler output mit prozente richtig in Verbindung bringt?

Vielen Dank für Ihre Unterstützung!
by SoSci Survey (327k points)
> Zwar erscheinen jetzt im ersten Stimul Zahlen im Schieberegler, jedoch sind es die Falschen

Das preset() wirkt nur auf der aktuellen Seite. Packen Sie also nur die preset() auf die Seite, die Sie auf dieser Seite auch verwenden.

Warum die falschen Werte erscheinen? Sie haben in den pretest()-Blöcken unten immer denselben Schieberegler angegeben. Die Variablenkennung SL01_01 muss jeweils noch angepasst werden.

Und wie gesagt: Das preset() muss immer auf die passende Seite. Das Array können Sie mittels registerVariable() für alle folgenden Seiten verfügbar machen.
by s222544 (640 points)
Vielen Dank für Ihre Antwort! Alles funktioniert!

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

...