0 votes
in SoSci Survey (dt.) by s088442 (110 points)
edited by SoSci Survey

Hallo,

in meinem Fragebogen übernehme ich aus einer Frage Items in weitere Fragen.
Bei der Filterfrage wird abgefragt, wie häufig ein Medium in einer Woche genutzt wird. Ein Medienitem soll nur weiter verwendet werden, wenn der Wert mindestens 5 beträgt.
Die am häufigsten genutzten Medien sollen übernommen werden, allerdings maximal drei.
Die Frage ist, wie ich im Falle, dass zwei Medien den gleichen Wert haben, zufällig einen davon auswähle. Wenn also ein Medium den Wert 8, eines 7 und zwei 6 haben, wie kann dann von den zwei Medien mit dem Wert 6 per Zufall eins ausgewählt werden. Aber wenn zwei Medienitems den Wert 8 haben, eines 7 und eines 6, sollen logischerweise die zwei Medienitems mit dem Wert 8 und das eine Item mit dem Wert 7 weiter verwendet werden. Bisher wird nach dem Kriterium der Größe des Wertes immer dasjenige von zwei Items mit gleichem Wert ausgewählt, welches die größere Kennnummer hat.
Der Code lautet bisher wie folgt:

$itemliste = getItems('IA01', 'min', 5);  // Relevante Items ermitteln
rsort($itemliste); // Liste der Größe nach sortieren

// Fragen zu den Items definieren
$fragen = array(
  1 => 'MG01',
  2 => 'MG02',
  3 => 'MG03',
  4 => 'MG04',
  5 => 'MG05',
  6 => 'MG06',
  7 => 'MG07'
);
$anzahl = count($itemliste); 
if ($anzahl == 0) {
  goToPage('MNPI'); // Nichts genutzt, weiter
}
if ($anzahl > 3) {
  $anzahl = 3; // Maximal drei

for ($i=0; $i<$anzahl; $i++) {
  $item_kenn = $itemliste[$i]; // Einer der genutzten Medien (1 bis 7)
  $frage_kenn = $fragen[$item_kenn];  // Die entspr. Frage
  question($frage_kenn);  // Frage stellen
}}

Vielen Dank im Voraus!

2 Answers

0 votes
by SoSci Survey (327k points)

Ich denke, dieser PHP-Code enthält gleich zu Beginn einen wesentlichen Denkfehler: getItems() liefert nämlich nur die Item-Nummern, nicht den Antwortcode (=Nutzungsmenge). Deshalb sortiert 'rsort()` einfach nur das Item mit der höchsten ID nach vorne.

Meine Empfehlung wäre, dass Sie ein wenig anders an die Sacher herangehen. Lassen Sie sich erstmal eine Liste mit Item-Kennungen und Antwortcode via valueList() ausgeben:

$values = valueList('IA01');

Dann ermitteln Sie den Maximalwert in dieser Liste.

$max = max($values);

Jetzt suchen Sie entweder mittels getItems() oder "zu Fuß" die Items heraus, die den Maximalwert haben. Vorausgesetzt, der Maximalwert reicht aus (IF am Anfang).

if ($max >= 5) {
  $items = getItems('IA01', 'is', $max);
} else {
  goToPage('MNPI');
}

Nun wählen wir aus der Liste (egal wie lang) eines zufällig aus:

shuffle($items);
$item = $items[0];

Die Variable $item sollte nun genau das liefern, was Sie brauchen.

by s088442 (110 points)
Vielen Dank für die schnelle Hilfe!
Mir sind leider noch zwei Sachen unklar.
In meinem Fall möchte ich nicht nur den einen Maximalwert aus der valuelist herausziehen, sondern die drei größten Werte. Wie kann ich das erzielen? Zudem könnte es vorkommen, dass neben dem erst- und zweitgrößten Wert zwei drittgrößte Werte existieren. Wie kann ich von diesen zweien einen per Zufall wählen?
Als zweites würde ich noch gern wissen, ob ich mit dem value-list-Vorgehen auch die ausgewählen Items in Folgefragen übernehmen kann, wie in meinem Code oben beschrieben. Funktioniert das auch mit dem array und der for-Schleife?
Nochmals vielen Dank!
0 votes
by SoSci Survey (327k points)

In meinem Fall möchte ich nicht nur den einen Maximalwert aus der valuelist herausziehen, sondern die drei größten Werte. Wie kann ich das erzielen? Zudem könnte es vorkommen, dass neben dem erst- und zweitgrößten Wert zwei drittgrößte Werte existieren. Wie kann ich von diesen zweien einen per Zufall wählen?

Dafür müssen Sie die Liste der Items erstmal nach Werten sortieren - und jedes Array dann in sich mischen. Das kann z.B. so aussehen:

// Eine Liste erstellen (eine pro Antwortcode), die aus mehreren Listen besteht
$values = valueList('IA01');
$byVal = array();
foreach ($values as $var => $value) {
  // Werte kleiner 5 fliegen raus
  if ($value < 5) {
    continue;
  }
  // Evtl. die Teilliste für diesen Antwortcode anlegen
  if (!isset($byVal[$value])) {
    $byVal[$value] = array();
  }
  $byVal[$value][] = (int)substr($var, 5);  // Nur die letzten Stellen der Variable-Kennung verwenden
}
// Innerhalb jeder Gruppe/Teilliste mischen
foreach ($byVal as $value => $items) {
  shuffle($byVal[$value]);
}
// Alles wieder zusammenbauen
$gesamt = array();
foreach ($byVal as $value => $items) {
  $gesamt = array_merge($gesamt, $items);
}
// Und daraus die ersten drei verwenden
$auswahl = array_slice($gesamt, 0, 3);

Als zweites würde ich noch gern wissen, ob ich mit dem value-list-Vorgehen auch die ausgewählen Items in Folgefragen übernehmen kann, wie in meinem Code oben beschrieben.

Ja und nein. Oben Sehe Sie bereits eine Lösung dafür. Sie sehen aber auch, dass mittels substr() erstmal die Item-Kennung (z.B. 01) aus der Variablen-Kennung (z.B. IA01_01) extrahiert werden muss.

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

...