0 votes
in SoSci Survey (dt.) by s109993 (10.3k points)

Ich habe eine Mehrfachauswahl, bei welcher die Itembeschriftungen Platzhalter sind, welche aus einer Datenbank kommen.

Zum Beispiel:
Item 1: %Platzhalter1%
Item 2: %Platzhalter2%
Item 3: %Platzhalter3%

Die Datenbank befüllt die Items dann, je nach Fall:
Item 1: %9a%
Item 2: %9b%
Item 3: %9c%

Jetzt würde ich gerne die Labels (also die Itembeschriftung) abspeichern, die von einer Person ausgewählt wurde. Zum Beispiel, wenn jemand bei dem oberen Beispiel Item 2 und Item 3 auswählt, würde ich gerne für diese Person 9b und 9c abspeichern- zum Beispiel in einer internen Variable. Grund dafür ist, dass ich mit diesen Strings später noch arbeiten muss.

Ist das überhaupt möglich?

1 Answer

0 votes
by SoSci Survey (306k points)
selected by s109993
 
Best answer

Am besten verwenden sie den Code, mit dem Sie die Platzhalter setzen. Wenn der z.B. lautet ...

$data = dbGet(...);
replace('%Platzhalter1%', $data[1]);
replace('%Platzhalter2%', $data[2]);
replace('%Platzhalter3%', $data[3]);

Und Sie haben nun die Antwort auf die Frage MA01, dann könnte das Speichern so aussehen:

$data = dbGet(...);
$items = getItems('MA01', 'is', 2);

$selected = [];
foreach ($items as $item) {
    $selected[] = $data[$item];
}
// entweder
put('IV01_01', implode(', ', $selected));
// oder
putList('IV01', $selected);
by s109993 (10.3k points)
Danke, probiere ich morgen früh gleich aus!
by s109993 (10.3k points)
Dieses Vorgehen würde allerdings nur den Wert wo das Kreuz gesetzt wurde abspeichern, allerdings nicht den String aus der Datenbank, welcher als Platzhalter verwendet wird- sehe ich das richtig?
by SoSci Survey (306k points)
Doch, Sie würden ja mit dem $data[$item] genau diesen String in $selected schreiben. Bei Ihnen würde es wohl ein klein wenig anders aussehen, weil die Daten vermutlich nicht genau so in Platzhalter übernommen werden. Die Zuordnung Item-Nummer -> String wäre also vermutlich ein wenig aufwändiger.
by s109993 (10.3k points)
Ich bräuchte glaube ich einen weitere Tipp:
$data = dbGet(...);
replace('%Platzhalter1%', $data[1]);
replace('%Platzhalter2%', $data[2]);
replace('%Platzhalter3%', $data[3]);

das wäre bei mir vergleichbar mit:
$data[38]
$data[39]
$data[40] etc.

Habe ich es richtig verstanden, dass es einfacher wäre, wenn ich Das zu [1][2][3] ändere wie in Ihrem Beispiel? Also der Index der internen Variable sollte übereinstimmen mit dem der Datenbank für Inhalte?
by SoSci Survey (306k points)
> Habe ich es richtig verstanden, dass es einfacher wäre, wenn ich Das zu [1][2][3] ändere

Nein, nicht unbedingt - wenn die Item-Nummern systematisch um 37 verschoben sind, ist es ganz einfach:

foreach ($items as $item) {
    $selected[] = $data[$item + 37];
}

Wenn die Zuordnung weniger systemtisch ist, bräuchten sie vielleicht eine kleine Liste, z.B.

$indices = [
  1 => 38,
  2 => 39,
  3 => 40,
  ...
];
foreach ($items as $item) {
    $selected[] = $data[$indices[$item]];
}
by s109993 (10.3k points)
Das funktioniert (man muss nur die Werte mit(int) definieren. Eine hoffentlich allerletzte Frage habe ich. Das ganze soll noch in einer zufälligen Reihenfolge passieren. Das bekomme ich auch hin, es speichert auch die Werte etc. Mein Problem ist, wenn jemand eine Auswahl trifft, die nächsten Fragen beantwortet, zurück zur Auswahl geht und neue Optionen hinzufügt oder wegnimmt. Gleichzeitig soll aber die zufällige Reihenfolgen gleich bleiben, wenn man die Seite erneut aufruft, ohne etwas zu ändern (das funktioniert momentan auch). Vielleicht haben Sie da noch einen Tipp :)

$key = caseSerial();
$preload = dbGet($key);

    replace('%Klasse1%', $preload[37]);    // Klasse1
    replace('%Klasse2%', $preload[38]);    // Klasse2
    replace('%Klasse3%', $preload[39]);    // Klasse3
    replace('%Klasse4%', $preload[40]);    // Klasse4
    replace('%Klasse5%', $preload[41]);    // Klasse5
    replace('%Klasse6%', $preload[42]);    // Klasse6

if (!isset($selected)) {

$itemliste = getItems('X005', 'is', 2);


$selected = [];
foreach ($itemliste as $item) {
    $selected[] = $preload[(int)$item + (int)36];
}

shuffle($selected);
registerVariable($selected);
}
putList('X004', $selected);
by SoSci Survey (306k points)
Nun, wenn jemand die Auswahl ändert, die zufällige Abfolge aber gleich bleiben soll, dann müssen Sie die Zufallsreihenfolge mit allen Optionen erstellen und speichern, und die Anzeige dann erst im zweiten Schritt filtern. Also ungefähr so:

if (!isset($random)) {
  $random = getItems('X005', 'all');
  shuffle($random);
  registerVariable($random);
}

So haben Sie eine stabile Reihenfolge, und dann wählen Sie aus:

$itemliste = getItems('X005', 'is', 2);
$item_display = array_intersect($random, $itemliste);
question('XY01', $item_display);

Und dann noch Ihre interne Variable

$selected = [];
foreach ($itemliste as $item) {
    $selected[] = $preload[(int)$item + (int)36];
}
putList('X004', $selected);
by s109993 (10.3k points)
Ich verstehe Ihr Prinzip, und es macht für micht auch Sinn und es läuft auch, nur werden die Werte nicht randomisiert in der Variable X004 abgespeichert. Allerdings verstehe ich nicht, wieso nicht. Ich bin weiterhin am rumprobieren, aber wenn Sie das Problem sehen, wäre ich natürlich dankbar über einen Hinweis.

EDIT: Problem gefunde: $itemliste -> $item_display in der foreach Loop. Das passt jetzt hoffentlich. Danke für Ihre Geduld!
by SoSci Survey (306k points)
>  nur werden die Werte nicht randomisiert in der Variable X004 abgespeichert.

Das liegt daran, dass ich die rotierte Abfolge in $random speichere, und die Items der Frage entsprechend rotiere (via $item_display) - aber die gewählten Items aus $selected in X004 speichere. Sie können natürlich auch $item_display statt $selected für den letzten Block verwenden.

Sehen Sie nur bitte zu, dass Sie am Ende die gespeicherten Werte den Items zuordnen können, und alle Daten für die Auswertung haben. Bei so viel Basteln an den Zuordnungen speichert man schnell das falsche.

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

...