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

Hallo SoSci Survey Support Team,

vielen Dank für die bisherige, tolle Unterstützung meiner Umfrage.

Ist folgendes Design in SoSci umsetzbar?

Als ersten Schritt antwortet der Proband auf die Frage mithilfe drei Textfelder auf die Frage (alle drei Textfelder fragen nach Zahlen - die Summe soll 100 ergeben) --> ziemlich einfach umsetzbar und schon geschehen.

Jetzt der komplizierte Part ohne, dass der Proband davon etwas mitbekommt.
Da ich (ohne Auswertung) nicht weiß welche Zahlen der Proband eingegeben hat, möchte ich sowas wie haben: Zahl 1 zwischen 0 und 15, Antwort des Probanden soll um 17% erhöht werden.
Zahl 1 zwischen 16 und 32, Antwort des Probanden soll um 10% erhöht werden.

Usw., sodass alle drei Zahlen nach bestimmten Regeln verändert werden.

Die veränderten Zahlen sollen als nächstes dem Probanden angezeigt werden und Folgefragen erscheinen basierend auf den neuen Zahlen.

Ich bin für Umsetzungsvorschläge sehr dankbar!

Viele Grüße!

1 Answer

0 votes
by SoSci Survey (306k points)

Im Prinzip müssen Sie das, was Sie scheiben nur als PHP-Code formulieren:

welche Zahlen der Proband eingegeben hat

$zahl1 = (int)value('AB01_01');
$zahl2 = (int)value('AB01_02');
$zahl3 = (int)value('AB01_03');

Zahl 1 zwischen 0 und 15, Antwort des Probanden soll um 17% erhöht werden.

if (($zahl1 >= 0) && ($zahl1 <= 15)) {
  $zahl1 = $zahl1 + 17;
}

Zahl 1 zwischen 16 und 32, Antwort des Probanden soll um 10% erhöht werden

if (($zahl1 >= 16) && ($zahl1 <= 32)) {
  $zahl1 = $zahl1 + 10;
}

Ich verstehe es jetzt mal so, dass Sie "um 10% erhöht" als einfache Addition verstehen. Man kann natürlich auch 10% auf die Zahl draufschlagen.

Und das IF lässt sich auch noch ein wenig eleganter koppeln:

if ($zahl1 < 0) {
    repeatPage();
} elseif ($zahl1 <= 15) {
    $zahl1 = $zahl1 + 17;
} elseif ($zahl1 <= 32) {
    $zahl1 = $zahl1 + 10;
}
by s222544 (565 points)
Vielen Dank für die sehr hilfreiche Antwort.

Da ich gerne Prozentveränderungen hätte (und keine Prozentpunkte) möchte ich folgendes umsetzen:
$zahl1 = (int)value('TE01_01');

if (($zahl1 >= 1) && ($zahl1 <= 5)) {
  $zahl1N = $zahl1 * (1+0.25);
usw.

Würde das so funktionieren?

Das zweite Problem gerade betrifft das Anzeigen der neuen Zahlen.
Am liebsten würde ich Platzhalter für die veränderten Werte benutzen, damit ich die Nachricht als Text nicht 5 Mal wiederholen muss.

Kann ich das replace('%$Zahl1N%', 'TE01_01', 'response'); direkt unter die PHP Zahlen einsetzen?
Sodass ich im Text schreiben kann: Aufgrund von externen Einflüssen hat sich Ihre Verteilung wie folgt verändert: %$Zahl1N% etc.

Brauche ich für die veränderten Zahlen eine interne Variable?

Ich möchte, dass der Proband das Experiment fünf Mal wiederholt. Brauche ich deswegen 5 verschiedene Platzhalter, für jeden Durchgang spezifische Platzhalter?

Vielen Dank im Voraus!
by SoSci Survey (306k points)
> Würde das so funktionieren?

Ja ... aber probieren Sie es doch einfach aus :)

> Kann ich das replace('%$Zahl1N%', 'TE01_01', 'response'); direkt unter die PHP Zahlen einsetzen?

Nein, weil '%$Zahl1N%' kein gültiger Platzhalter ist. Aber wenn Sie  $zahl1N anzeigen möchten, verwenden Sie das hier:
sprintf('%0.1f%', $zahl1N)

damit runden Sie erstmal auf eine Nachkommastelle und das bauen Sie wie folgt in replace() ein:

replace('%zahl1%', sprintf('%01f%', $zahl1N));

Oder wenn Sie es in zwei Schritten haben wollen:

$zahlRund = sprintf('%01f%', $zahl1N)
replace('%zahl1%', $zahlRund);

> Brauche ich für die veränderten Zahlen eine interne Variable?

"Brauchen" ist so ein hartes Wort. Aber wenn Sie es gleich abspeichern, tun Sie sich bei der Auswertung eventuell einfacher.

> Brauche ich deswegen 5 verschiedene Platzhalter, für jeden Durchgang spezifische Platzhalter?

Das kommt auf die Programmierung an. Im Prinzip kann man einen Platzhalter auch in jedem Durchgang neu setzen.
by s222544 (565 points)
Vielen Dank für Ihre Antwort.

Bei der geplanten Umsetzung der Veränderung der Zahlen trat folgender Fehler auf:
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Befehl oder String (Text) nicht abgeschlossen

Hinter einem Befehl wie z.B. question() steht kein Strichpunkt oder
ein String (Text in Anführungszeichen) ist nicht abgeschlossen oder
im String selbst kommt ein Anführungszeichen vor, z.B. html('Mach's besser!'); – in diesem Fall stellen Sie dem Anführungszeichen einen Backslash (\) voran.
Möglicherweise stimmen die öffnenenden und schließenden geschweiften Klammern für Anweisungsblöcke auch nicht überein.
PHP-Code

004 $zahl2 = (int)value('TE01_02');
005 $zahl3 = (int)value('TE01_03');
006
007 if ($zahl1 = 0){
008     zahl1N = $zahl1;
009 }
010 if (($zahl1 >= 1) && ($zahl1 <= 5)) {
011     zahl1N = $zahl1 * (1+0.25);

Im PHP Code habe ich folgendes:
$zahl1 = (int)value('TE01_01');
$zahl2 = (int)value('TE01_02');
$zahl3 = (int)value('TE01_03');

if ($zahl1 = 0){
    zahl1N = $zahl1;
}
if (($zahl1 >= 1) && ($zahl1 <= 5)) {
    zahl1N = $zahl1 * (1+0.25);
}
if (($zahl1 >= 6) && ($zahl1 <= 10)) {
    zahl1N = $zahl1 * (1+0.33);
}
if (($zahl1 >= 11) && ($zahl1 <= 36)) {
    zahl1N = $zahl1 * (1-0.05);
}
usw.

Am Ende desselben PHP Codes: replace('%zahl1%', sprintf('%01f%', $zahl1N));

Ich denke, ich habe die Strichpunkte an allen nötigen Stellen eingebaut, geschweifte Klammern stimmen in der Anzahl überein und Text hat Anführungszeichen.

Vielen Dank für Ihre Hilfe!
by SoSci Survey (306k points)
> if ($zahl1 = 0){

Für die Filter-Bedingung müssen Sie zwei Gleichheitszeichen verwenden, sonst ändern Sie den Wert von $zahl1.

Die Fehlermeldung stammt aber von der folgenden Zeile - da fehlt das Dollar-Zeichen vor dem $zahl1N:

zahl1N = $zahl1;

So weiß PHP nicht, dass zahl1N eine Variable sein soll.
by s222544 (565 points)
Vielen Dank für Ihre Antwort!
Folgender Fehler tritt jetzt auf:
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: 3 arguments are required, 2 given
Zeile: 31

PHP-Code

028 if ($zahl1 >= 96){
029     $zahl1N = $zahl1;
030 }
031 replace('%zahl1%', sprintf('%01f%', $zahl1N));
032 return 'ok';

sowie:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined variable $zahl2
Zeile: 3

PHP-Code

001 namespace s2survey\questionnaire\environment;
002
003 if ($zahl2 == 0){
004     $zahl2N = $zahl2;
005 }
006 if (($zahl2 >= 1) && ($zahl2 <= 13)) {

als auch

Fehler im Fragebogen: Undefined variable $zahl2
Zeile: 33

PHP-Code

030 if (($zahl2 >= 93) && ($zahl2 <= 95)) {
031     $zahl2N = $zahl2 * (1+0.04);
032 }
033 if ($zahl2 >= 96){
034     $zahl2N = $zahl2;
035 }
036 replace('%zahl2%', sprintf('%01f%', $zahl2N));
Fehler im Fragebogen: 3 arguments are required, 2 given
Zeile: 36

PHP-Code

033 if ($zahl2 >= 96){
034     $zahl2N = $zahl2;
035 }
036 replace('%zahl2%', sprintf('%01f%', $zahl2N));
037 return 'ok';


Könnten Sie mir hier bitte helfen?

Vielen Dank!
by SoSci Survey (306k points)
> Undefined variable $zahl2

Posten Sie gerne mal Ihren kompletten (aktuellen) Code. Es scheint so, dass Sie die Variable $zahl2 nicht setzen/initialisieren.

> Fehler im Fragebogen: 3 arguments are required, 2 given

Im sprintf() darf nur ein Prozentzeichen stehen. Das hatte ich oben falsch notiert, also:

replace('%zahl2%', sprintf('%01f', $zahl2N));
by s222544 (565 points)
Vielen Dank für Ihre Antwort.
Hier der Code:
$zahl1 = (int)value('TE01_01');
$zahl2 = (int)value('TE01_02');
$zahl3 = (int)value('TE01_03');

if ($zahl1 == 0){
    $zahl1N = $zahl1;
}
if (($zahl1 >= 1) && ($zahl1 <= 5)) {
    $zahl1N = $zahl1 * (1+0.25);
}
if (($zahl1 >= 6) && ($zahl1 <= 10)) {
    $zahl1N = $zahl1 * (1+0.33);
}
if (($zahl1 >= 11) && ($zahl1 <= 36)) {
    $zahl1N = $zahl1 * (1-0.05);
}
if (($zahl1 >= 37) && ($zahl1 <= 49)) {
    $zahl1N = $zahl1 * (1+0.11);
}
if (($zahl1 >= 50) && ($zahl1 <= 69)) {
    $zahl1N = $zahl1 * (1-0.07);
}
if (($zahl1 >= 70) && ($zahl1 <= 95)) {
    $zahl1N = $zahl1 * (1+0.04);
}
if ($zahl1 >= 96){
    $zahl1N = $zahl1;
}
replace('%zahl1%', sprintf('%01f', $zahl1N));

if ($zahl2 == 0){
    $zahl2N = $zahl2;
}
if (($zahl2 >= 1) && ($zahl2 <= 13)) {
    $zahl2N = $zahl2 * (1+0.34);
}
if (($zahl2 >= 14) && ($zahl2 <= 26)) {
    $zahl2N = $zahl2 * (1+0.17);
}
if (($zahl2 >= 27) && ($zahl2 <= 36)) {
    $zahl2N = $zahl2 * (1-0.11);
}
if (($zahl2 >= 37) && ($zahl2 <= 45)) {
    $zahl2N = $zahl2 * (1+0.39);
}
if (($zahl2 >= 46) && ($zahl2 <= 59)) {
    $zahl2N = $zahl2 * (1-0.23);
}
if (($zahl2 >= 60) && ($zahl2 <= 72)) {
    $zahl2N = $zahl2 * (1+0.15);
}
if (($zahl2 >= 73) && ($zahl2 <= 83)) {
    $zahl2N = $zahl2 * (1+0.10);
}
if (($zahl2 >= 84) && ($zahl2 <= 92)) {
    $zahl2N = $zahl2 * (1-0.23);
}
if (($zahl2 >= 93) && ($zahl2 <= 95)) {
    $zahl2N = $zahl2 * (1+0.04);
}
if ($zahl2 >= 96){
    $zahl2N = $zahl2;
}
replace('%zahl2%', sprintf('%01f', $zahl2N));

if ($zahl3 == 0){
    $zahl3N = $zahl3;
}
if (($zahl3 >= 1) && ($zahl3 <= 12)) {
    $zahl3N = $zahl3 * (1+0.26);
}
if (($zahl3 >= 13) && ($zahl3 <= 22)) {
    $zahl3N = $zahl3 * (1+0.22);
}
if (($zahl3 >= 23) && ($zahl3 <= 34)) {
    $zahl3N = $zahl3 * (1-0.14);
}
if (($zahl3 >= 35) && ($zahl3 <= 42)) {
    $zahl3N = $zahl3 * (1+0.16);
}
if (($zahl3 >= 43) && ($zahl3 <= 57)) {
    $zahl3N = $zahl3 * (1+0.22);
}
if (($zahl3 >= 58) && ($zahl3 <= 63)) {
    $zahl3N = $zahl3 * (1-0.10);
}
if (($zahl3 >= 64) && ($zahl3 <= 76)) {
    $zahl3N = $zahl3 * (1+0.08);
}
if (($zahl3 >= 77) && ($zahl3 <= 82)) {
    $zahl3N = $zahl3 * (1+0.03);
}
if (($zahl3 >= 83) && ($zahl3 <= 90)) {
    $zahl3N = $zahl3 * (1-0.09);
}
if (($zahl3 >= 91) && ($zahl3 <= 93)) {
    $zahl3N = $zahl3 * (1+0.05);
}
if ($zahl3 >= 94){
    $zahl3N = $zahl3;
}
replace('%zahl3%', sprintf('%01f', $zahl3N));


Kann ich bei der replace Funktion gleich eine ganze Zahl anzeigen lassen, ohne Dezimalstellen?
by SoSci Survey (306k points)
> Kann ich bei der replace Funktion gleich eine ganze Zahl anzeigen lassen, ohne Dezimalstellen?

Ja, natürlich. Abrunden erfolgt mit (int)$zahl3N, richtiges Runden mit round($zahl3N).

> Undefined variable $zahl2

Könnte es sein, dass Sie den PHP-Code auf mehrere PHP-Code-Blöcke aufgeteilt haben? Variablen gelten nur innerhalb eines PHP-Code-Blocks. Das

$zahl2 = (int)value('TE01_02');

muss also im selben Block stehen wie

if ($zahl2 == 0){
    $zahl2N = $zahl2;
}
...
by s222544 (565 points)
Vielen Dank! Dieser PHP-Code funktioniert jetzt einwandfrei.

Bei dieser Funktion replace('%zahl1%', sprintf('%01f', round($zahl1N))); kommt als Ergebnis 73.000000 heraus. Wie kann ich die unnötigen Nullen entfernen?

Des Weiteren habe ich versucht, die auf der vorherigen Seite eingegeben, Zahlen auf der nächsten Seite anzuzeigen.
Zum besseren Verständnis: Seite 2 Frage TE01 fragt in 01, 02 und 03 nach 3 Zahlen. Diese Zahlen werden auf Seite 3 nach den Regeln im oben stehenden PHP Code verändert.
Seite 3 beginnt mit folgendem Code: replace('%1_bargeld%', 'TE01_01', 'response');
replace('%1_aktien%', 'TE01_02', 'response');
replace('%1_anleihen%', 'TE01_03', 'response');

Danach folgt der PHP Code mit den Regeln.
Darunter Text mit den Platzhaltern %zahl1% usw.
Unter diesem Text wollte ich mit %1_bargeld%, %1_aktien% und %1_anleihen% die vorherigen Antworten anzeigen.

Im Fragebogen erscheint aber nur %1_bargeld% und nicht der angegebene Wert.
Klappt es nicht, weil ich keine internen Variablen habe? Ich habe dazu in der Anleitung zu den Platzhaltern nichts gefunden - also, dass eine IV existieren muss.

Vielen Dank für Ihre Unterstützung und Hilfe!
by s222544 (565 points)
Inzwischen habe ich das Problem mit den Platzhaltern gelöst.
Das Problem mit den Nachkommastellen bleibt und ich bin sehr dankbar für Ihre Hilfe!
by SoSci Survey (306k points)
Wenn Sie runden, brauchen Sie kein sprintf() mehr, also nur

replace('%zahl1%', round($zahl1N));

Sollten dann immer noch Nachkommastellen erscheinen, dann verwanden Sie die Zahl explizit noch in eine ganze Zahl:

replace('%zahl1%', (int)round($zahl1N));

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

...