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 (304k 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 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 (304k 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 (304k 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

...