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

Ich habe zwei Fragen mit beliebig vielen offenen Angaben (Frage nach internen und externen Kontaktpersonen: IK01 und IK02). Die angegebenen Kontaktpersonen sollen in den Folgefragen (SK06 und SK07) als Items einer Skala angezeigt werden. Mit folgendem Code klappt das auch. Allerdings werden leere Zeilen angezeigt, wenn nur jeweils 3 Kontaktpersonen angegeben werden. Wie werde ich diese leeren Zeilen los?

$items = array();

foreach (array('IK01', 'IK02') as $frage) {
    for ($i = 1; $i <= 10; $i++) {
        $nummer = str_pad($i, 2, '0', STR_PAD_LEFT);
        $antwort = trim(value($frage . '_' . $nummer));
        if ($antwort != '' && !in_array($antwort, $items)) {
            $items[] = $antwort;
        }
    }
}

// Platzhalter ersetzen
for ($i = 0; $i < count($items); $i++) {
   replace('%Akteur' . ($i + 1) . '%', $items[$i]);
}

for ($i = count($items) + 1; $i <= 10; $i++) {
   replace('%Akteur' . $i . '%', '');
} 

Auf nächster Fragebogenseite:

question('SK07');
question('SK06');

1 Answer

0 votes
ago by SoSci Survey (346k points)

Anstatt die Variablen-Kennung manuell zusammenzusetzen würde ich die Funktion id() empfehlen.

Ich denke aber, Sie haben einen problematischen Fehler im Code. Sobald jemand Zeile frei lässt oder eine Namen doppelt angibt, sehen Sie in den Daten nicht mehr, auf welchen Namen sich die Bewertung bezieht.

Allerdings werden leere Zeilen angezeigt

Das liegt daran, weil Sie im question()-Befehl nicht einschränken, welche Zeilen/Items gezeigt werden sollen, vgl. Items in eine andere Frage übernehmen.

Möchten Sie es anhand der Anleitung nochmal versuchen? Meine Empfehlung ist, dass Sie die Nennungen aus den beiden Eingangsfragen IK01 und IK02 erstmal getrennt behandeln und auch unterschiedliche Platzhalter verwenden, also z.B. %AkteurA...% und %AkteurB...%. Das in_array() können Sie ja weiterhin verwenden, um Dubletten zu entfernen.

Nur müssten sie eben in einem zusätzlichen Array notieren, aus welchen Item-Nummern die Nennungen stammen, sodass Sie im question()-Befehl, den Sie auf derselben Seite platzieren sollten wie den Code, die Items entsprechend einschränken können.

ago by s324635 (110 points)
Danke für die Antwort. Ich habe den Code jetzt noch einmal folgendermaßen umgeschrieben:
//Antworten aus IK01
$frage = 'IK01';
$items = array();
for ($i=1; $i<=10; $i++) {
  $itemID = id($frage, $i);
  $antwort = value($itemID);
  if (trim($antwort) != '' && !in_array($antwort, $items)) {
    replace('%AkteurA'.$i.'%', $antwort);
    $items[] = $i;
  }
}

//Antworten aus IK02
$frage2 = 'IK02';
$items2 = array();
for ($i2=1; $i2<=10; $i2++) {
  $itemID2 = id($frage2, $i2);
  $antwort2 = value($itemID2);
  if (trim($antwort2) != '' && !in_array($antwort2, $items2)) {
    replace('%AkteurI'.$i2.'%', $antwort2);
    $items2[] = $i2;
  }
}

//Antworten zusammenfügen und Anzeige in  nächsten Fragen einschränken

$added = array_merge($items, $items2);
if (count($added) > 0) {
 question('SK06', $added);
 question('SK07', $added);
}

Es werden jetzt keine leeren Zeilen mehr eingeblendet, allerdings werden nur (und nicht vollständig) Angaben aus der ersten Frage IK01 wiedergegeben. Es erscheint die Fehlermeldung "Für die Frage SK06 wurde kein Item mit der Kennung 1 gefunden".
In den Debug informationen sehe ich, dass die Platzhalter korrekt vorbereitet sind.

Wo liegt der Fehler?
ago by SoSci Survey (346k points)
> Für die Frage SK06 wurde kein Item mit der Kennung 1 gefunden

Prüfen Sie doch bitte mal, welche Kennungen die Items in SK06 haben. Wenn Sie in IK01 bis zu 10 Nennungen erlauben und in IK02 nochmal, dann sollten sie in SK06 Item mit den Kennungen 01 bis 10 (oder 20, s. unten) haben. Falls dort "Lücken" sind, können Sie die Items der Frage einfach neu organisieren.

Und dann habe ich noch eine ganz wichtige Frage: Sind SK06 und SK07 separate Fragen für die Akteure aus IK01 und IK02 oder sollen beide Fragen zu beiden Akteuren gestellt werden?

Wenn zweiteres der Fall ist, müssten Sie in beiden Fragen jeweils 20 Items vorbereiten, also %AkteurA1% bis %AkteurA10% und %AkteurI1% bis %AkteurI10%, und in der Item-ID-Liste müssten Sie für die IK02 von 11 bis 20 zählen. Dafür müssten Sie die Zeile

    $items2[] = $i2;

ändern in

    $items2[] = $i2 + 10;

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

...