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

Guten Tag,

ich würde gerne aus der "Datenbank mit Inhalten" Items einer Frage befüllen. Das klappt auch wunderbar- das Problem ist, dass nicht alle Spalten befüllt sind. Das heißt, manchmal sind 3 von 6 Werten verfügbar manchmal 2 von 6 use. Die Anzahl der Items der Frage ändert sich also je nach Teilnehmer. Ich wäre den Weg gegangen, welcher hier vorgeschlagen wird: https://www.soscisurvey.de/help/doku.php/de:create:filter-items

Allerdings basiert der Code auf der Annahme, dass eine andere Frage vorher abgefragt wird.

Wie kann ich folgenden Code Anpassen, sodass er sich an die Anzahl der befüllten Arrays anpasst (ich hätte glaube ich mit var_dump gearbeitet, aber die Funktion ist nicht zugelassen)?

Mein bisheriger Code:

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

replace('%Eng1%', $inhalt[0]);
replace('%Eng2%', $inhalt[1]);
replace('%Eng3%', $inhalt[2]);
replace('%Eng4%', $inhalt[3]);
replace('%Eng5%', $inhalt[4]);
replace('%Eng6%', $inhalt[5]);

2 Answers

0 votes
by SoSci Survey (304k points)

Die Anzahl der Items der Frage ändert sich also je nach Teilnehmer.

Die Schleife können Sie mittels array_key_exists() auch für ein Array verwenden. Oder alternativ setzen Sie die Platzhalter nur für die vorhandenen Schlüssel via foreach.

$items = [];
foreach ($inhalt as $i => $text) {
  $items[] = $i + 1;  // Falls Sie die Itemliste brauchen
  replace('%Eng'.($i + 1).'%', $text);
}
by s109993 (9.9k points)
Ich bin nicht ganz sicher, ob ich Sie richtig verstanden habe. Ich habe den Code folgendermaßen umgebaut, wie mir array_key_exists() helfen soll, verstehe ich nicht, da die Funktion nur einen True oder False liefert (oder?).

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

$items = [];
foreach ($inhalt as $i => $text) {
  $items[] = $i + 1;  // Falls Sie die Itemliste brauchen
  replace('%Eng'.($i + 1).'%', $text);
}


// test
html('
<div>'.$items[0].'</div>
');

// Weiter zur nächsten Seite, wenn nichts genutzt
if (count($items) == 0) {
  goToPage('next');
}
// Zweite Frage mit diesen Items stellen
question('A120', $items);
by SoSci Survey (304k points)
Das array_key_exists() wäre nur eine Option, wenn Sie den Code aus der Anleitung anpassen wollten. In dem Fall würden Sie das (value(...) = ...) ersetzen durch ein (array_key_exists(...)).

Ich persönlich würde das foreach() nehmen, wie in meiner Antwort vorgeschlagen.
by s109993 (9.9k points)
Ich habe mich vielleicht schlecht ausgedrückt. Das passiert momentan (siehe Bild) und ich hätte gerne nur die befüllten Items dort. Allerdings kann sich diese Anzahl verändern.
![][1]


  [1]: https://support.soscisurvey.de/?qa=blob&qa_blobid=4847175544445373767
by SoSci Survey (304k points)
Die genutzten Items müssen Sie im question()-Befehl natürlich noch übergeben:

question('A120', $items);

Die $items-Variable hatte ich in der Antwort oben deshalb extra vorgesehen.
by s109993 (9.9k points)
Es hat jetzt geklappt. Allerdings musste ich am Ende von der Itemliste ein Element mit array_pop entfernen,da es mir immer ein leeres Item zuviel ausgegeben hat- warum weiß ich leider auch nicht :)

$key = caseSerial();
$inhalt = dbGet($key);
$itemliste = array(); // Eine leere Liste erstellen
$inhalt1 = array_slice($inhalt ,0,  6);

$items = [];


foreach ($inhalt1 as $i => $text) { // Durchzählen von 1 bis 6
html( '<p>'.$i.' = '. $text.'</p>' );


    $itemliste[] = $i;

  replace('%Eng'.($i + 1).'%', $text);
}
// Nur zur Information
html( '<p>'. count($itemliste).' relevante Items: '. implode(', ', $itemliste). '</p>' );


// Weiter zur nächsten Seite, wenn nichts genutzt
if (count($itemliste) == 0) {
  goToPage('next');
}

// Zweite Frage mit diesen Items stellen

$itemliste2 = array_pop($itemliste);
question('A120', $itemliste);
by SoSci Survey (304k points)
> $itemliste[] = $i;

Die Variable $i startet bei 0 mit dem Zählen, die Items bei 1. Eventuell ist da noch was im Argen. Lassen Sie sich das Ergebnis doch mal mittels

debug($itemliste);

anzeigen.
by s109993 (9.9k points)
Ich musste es jetzt anders lösen (siehe zweite Antwort hier im Threat). Ich kam leider mit array_key_exists() nicht zurecht. Danke aber für Ihre Hilfe!
0 votes
by s109993 (9.9k points)

Ich habe das jetzt etwas anders gelöst. Ich kam leider mit array_key_exists() nicht so zurecht und mein anderer Code hatte Fehler. Das hier läuft jetzt aber super :

Zuerst habe ich zwei Funktionen erstellt die unter dem Reiter PHP-Funktionen stehen und daher für alle Seiten verfügbar sind:

// Funktion zum löschen der leeren key- value Paare in Arrays (anstatt array_key_exists();)
function remove_empty_keys($array) {
  $filtered_array = array();

  foreach ($array as $key => $value) {
    if (!empty($value)) {
      $filtered_array[$key] = $value;
    }
  }

  return $filtered_array;
}

// Funktion zum Anzeigen der Key-Value Paare (anstatt debug(); oder var_dump(); )

function display_array($array) {
  foreach ($array as $key => $value) {
    html("$key : $value");
  }
}

Dann konnte ich auf der Seite den folgenden Code verwenden:

// Serial in die Variable key laden
$key = caseSerial(); 

// Datenbank anhand der Serial als Array in $inhalt laden
$inhalt = dbGet($key);

// leeren Array $items erstellen
$items = [];

// array splitten, da ich hier nur die letzten 6 Spalten meiner Datenbank brauche 
$inhalt2 = array_slice($inhalt,6,6); 

// hier wird die oben genannte Funktion verwendet. Leere Key-Value Paare werden gelöscht
$inhalt3 = remove_empty_keys($inhalt2);

// zum Testen wird hier mit der anderen Funktion der Array angezeigt (später löschen)
display_array($inhalt3);

// Ab hier dann wie nach der Anleitung, außer, dass für $items keine zusätzliche Bedingung geschrieben werden muss, da wir jetzt alle Array Elemente darstellen können

foreach ($inhalt3 as $i => $text) {
  $items[] = $i + 1;  // Falls Sie die Itemliste brauchen
  replace('%Mat'.($i + 1).'%', $text);
}

if (count($items) == 0) {
  goToPage('next');
}

// Zweite Frage mit diesen Items stellen
question('A121', $items);

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

...