0 votes
in SoSci Survey (dt.) by s153384 (150 points)
edited by SoSci Survey

Hallo Liebes SoSci Team,

aktuell habe ich eine Studie, bei der ich 5 Blöcke randomisieren möchte. Die Rangfolge dieser Blöcke sollen gespeichert werden. Jeder Block besteht aus 2 "Sub-Blöcken", die jeweils dem Typ P oder Typ B zugeordnet werden können. Ich hätte nun gerne die Reihenfolge randomisiert in denen die Probanden die Typen präsentiert bekommen (z.B. Proband 1 bekommt immer zuerst P und dann B und Proband zwei immer erst Typ B und dann Typ P). Dabei soll trotzdem die Hauptblöcke 1-5 rotiert und abgespeichert werden. Ich habe mir da folgenden Code zusammengestellt mit zwei Fragen (eine für das Abspeichern der Rotation (S002) und eine für den Zufallsgenerator für die Randomisierung der Typen (S003). Das ist der Code:

//Für Typ P arrays b1a,b2a,b3a... und für Typ B b1b,b2b,b3b....
$parts = array(
  ‘b1a’ => array(‘K1PVideo-K1PEND’ ,  ‘K1BVideo-K1BEND’),
  ‘b1b’ => array(‘K1BVideo-K1BEND’ , ‘K1PVideo-K1PEND’),
  ‘b2a’ => array(‘K2PVideo-K2PEND’ ,  ‘K2BVideo-K2BEND’),
  ‘b2b’ => array(‘K2BVideo-K2BEND’ , ‘K2PVideo-K2PEND’),
  ‘b3a’ => array(‘K3PVideo-K3PEND’ ,  ‘K3BVideo-K3BEND’),
  ‘b3b’ => array(‘K3BVideo-K3BEND’ , ‘K3PVideo-K3PEND’),
  ‘b4a’ => array(‘K4PVideo-K4PEND’ ,  ‘K4BVideo-K4BEND’),
  ‘b4b’ => array(‘K4BVideo-K4BEND’ , ‘K4PVideo-K4PEND’),
  ‘b5a’ => array(‘K5PVideo-K5PEND’ ,  ‘K5BVideo-K5BEND’),
  ‘b5b’ => array(‘K5BVideo-K5BEND’ , ‘K5PVideo-K5PEND’),
);

  if (value('S003') == 1) {
$pages = array('b1a' , 'b2a', 'b3a', 'b4a', 'b5a');
// Die Seiten nicht direkt mischen, sondern deren Positionen
$indices = array_keys($pages);
shuffle($indices);
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $random speichern
$random = array();
for ($i=0; $i<count($indices); $i++) {
  // Rang speichern wie oben
  $id = id('S002', $indices[$i] + 1);
  put($id, $i + 1);	
  // Seite in der Abfolge speichern
  $random[$i] = $pages[$indices[$i]];
}
   //richtige Seite zum Weitermachen finden
   $random[] = 'EinleitungPKWvsBus';
    // Neue Seitenabfolge setzen
    setPageOrder($random);
question('S003');  // ReihenfolgePKWBus
}}
}  else {
$pages = array('b1b' , 'b2b', 'b3b', 'b4b', 'b5b');
// Die Seiten nicht direkt mischen, sondern deren Positionen
$indices = array_keys($pages);
shuffle($indices);
// Nun die Ränge speichern - und die neue Abfolge der Seiten in $random speichern
$random = array();
for ($i=0; $i<count($indices); $i++) {
  // Rang speichern wie oben
  $id = id('S002', $indices[$i] + 1);
  put($id, $i + 1);	
  // Seite in der Abfolge speichern
  $random[$i] = $pages[$indices[$i]];
}}
   //richtige Seite zum Weitermachen finden
   $random[] = 'EinleitungPKWvsBus';
    // Neue Seitenabfolge setzen
    setPageOrder($random);
question('S003');  // ReihenfolgePKWBus
}

Ich bekomme folgende Fehlermeldungen:
-Warnung: Bei den geschweiften Klammern stimmt die Anzahl öffnender Klammern (2) nicht mit der Anzahl schließender Klammern (3) überein. => Diese steht direkt dadrunter

Nun ist meine Frage, wo genau das Problem liegt und ob der Code so überhaupt funktionieren könnte bzw. wenn nicht was ich ändern müsste? Es ist acuh besonders wichtig, dass die Rangfolge gespeichert wird.
Vielen Lieben Dank schon mal!

2 Answers

+1 vote
by SoSci Survey (304k points)

Ich bin nicht sicher, ob es beim Kopieren hier in den Support passiert ist oder ob Sie den Code tatsächlich so im Fragebogen verwenden: Sie haben da typografische Anführungszeichen:

  ‘b1a’ => array(‘K1PVideo-K1PEND’ ,  ‘K1BVideo-K1BEND’),
  ‘b1b’ => array(‘K1BVideo-K1BEND’ , ‘K1PVideo-K1PEND’),

Es müssen aber gerade Anführungszeichen sein:

  'b1a' => array('K1PVideo-K1PEND' ,  'K1BVideo-K1BEND'),
  'b1b' => array('K1BVideo-K1BEND' , 'K1PVideo-K1PEND'),

Wenn man den Code nach Word kopiert oder ihn dort schreibt, dann macht Word solche Änderungen ungefragt. Verwenden Sie besser SciTE oder Notepad++.

Ob das die Fehlermeldung direkt auslöst, lässt sich nicht genau beurteilen. Womöglich stimmt auch etwas mit den geschweiften Klammern nicht. Da wäre es hilfreich, wenn Sie die Einrückung nochmal sauber vornehmen, sodass man die Blöcke besser erkennt.

by s153384 (150 points)
Vielen Dank schon mal für die Antwort. Ich habe das tatsächlich mit Word gemacht. etzt sind die Anführungszeichen grade, aber das Problem besteht immernoch. Ich hoffe die Einrückungen sind so jetzt besser:

$parts = array(
  'b1a' => array('K1PVideo-K1PEND' , 'K1BVideo-K1BEND'),
  'b1b' => array('K1BVideo-K1BEND' , 'K1PVideo-K1PEND'),
  'b2a'=> array('K2PVideo-K2PEND' ,  'K2BVideo-K2BEND'),
  'b2b' => array('K2BVideo-K2BEND' , 'K2PVideo-K2PEND'),
  'b3a' => array('K3PVideo-K3PEND' , 'K3BVideo-K3BEND'),
  'b3b' => array('K3BVideo-K3BEND' , 'K3PVideo-K3PEND'),
  'b4a' => array('K4PVideo-K4PEND' , 'K4BVideo-K4BEND'),
  'b4b' => array('K4BVideo-K4BEND' , 'K4PVideo-K4PEND'),
  'b5a' => array('K5PVideo-K5PEND' , 'K5BVideo-K5BEND'),
  'b5b' => array('K5BVideo-K5BEND' , 'K5PVideo-K5PEND'),
);

  if (value('S003') == 1) {
       $pages = array('b1a' , 'b2a', 'b3a', 'b4a', 'b5a');
      // Die Seiten nicht direkt mischen, sondern deren Positionen
      $indices = array_keys($pages);
       shuffle($indices);
       // Nun die Ränge speichern - und die neue Abfolge der Seiten in $random           speichern
            $random = array();
            for ($i=0; $i<count($indices); $i++) {
            // Rang speichern wie oben
            $id = id('S002', $indices[$i] + 1);
            put($id, $i + 1);   
            // Seite in der Abfolge speichern
            $random[$i] = $pages[$indices[$i]];
}
      //richtige Seite zum Weitermachen finden
      $random[] = 'EinleitungPKWvsBus';
      // Neue Seitenabfolge setzen
      setPageOrder($random);
question('S003');  // ReihenfolgePKWBus
}}


}  else {
      $pages = array('b1b' , 'b2b', 'b3b', 'b4b', 'b5b');
      // Die Seiten nicht direkt mischen, sondern deren Positionen
      $indices = array_keys($pages);
      shuffle($indices);
      // Nun die Ränge speichern - und die neue Abfolge der Seiten in $random   speichern
            $random = array();
            for ($i=0; $i<count($indices); $i++) {
            // Rang speichern wie oben
            $id = id('S002', $indices[$i] + 1);
            put($id, $i + 1);   
            // Seite in der Abfolge speichern
            $random[$i] = $pages[$indices[$i]];
}}

    //richtige Seite zum Weitermachen finden
   $random[] = 'EinleitungPKWvsBus';
    // Neue Seitenabfolge setzen
    setPageOrder($random);
question('S003');  // ReihenfolgePKWBus
}


Ich habe also zuerst die arrays für beide Typen geschrieben, dann über einen Zufallsgenerator entweder Typ P oder Typ B ausgewählt und dann einen Rotationscode für beide einzeln verfasst.
Ich habe auch schon mal probiert bei den gescheiften Klammern etwas zu ändern, konnte da aber keine Lösung finden.
Vielen Dank!
+1 vote
by SoSci Survey (304k points)

Ich habe den Code nochmal ganz ordentlich formatiert. Das könnte dann so aussehen:

$parts = array(
    'b1a' => array(
        'K1PVideo-K1PEND',
        'K1BVideo-K1BEND'
    ),
    'b1b' => array(
        'K1BVideo-K1BEND',
        'K1PVideo-K1PEND'
    ),
    'b2a' => array(
        'K2PVideo-K2PEND',
        'K2BVideo-K2BEND'
    ),
    'b2b' => array(
        'K2BVideo-K2BEND',
        'K2PVideo-K2PEND'
    ),
    'b3a' => array(
        'K3PVideo-K3PEND',
        'K3BVideo-K3BEND'
    ),
    'b3b' => array(
        'K3BVideo-K3BEND',
        'K3PVideo-K3PEND'
    ),
    'b4a' => array(
        'K4PVideo-K4PEND',
        'K4BVideo-K4BEND'
    ),
    'b4b' => array(
        'K4BVideo-K4BEND',
        'K4PVideo-K4PEND'
    ),
    'b5a' => array(
        'K5PVideo-K5PEND',
        'K5BVideo-K5BEND'
    ),
    'b5b' => array(
        'K5BVideo-K5BEND',
        'K5PVideo-K5PEND'
    )
);

if (value('S003') == 1) {
    $pages = array(
        'b1a',
        'b2a',
        'b3a',
        'b4a',
        'b5a'
    );
    // Die Seiten nicht direkt mischen, sondern deren Positionen
    $indices = array_keys($pages);
    shuffle($indices);
    // Nun die Ränge speichern - und die neue Abfolge der Seiten in $random speichern
    $random = array();
    for ($i = 0; $i < count($indices); $i++) {
        // Rang speichern wie oben
        $id = id('S002', $indices[$i] + 1);
        put($id, $i + 1);
        // Seite in der Abfolge speichern
        $random[$i] = $pages[$indices[$i]];
    }
    // richtige Seite zum Weitermachen finden
    $random[] = 'EinleitungPKWvsBus';
    // Neue Seitenabfolge setzen
    setPageOrder($random);
    question('S003'); // ReihenfolgePKWBus
}}


}  else {
    $pages = array('b1b' , 'b2b', 'b3b', 'b4b', 'b5b');
    // Die Seiten nicht direkt mischen, sondern deren Positionen
    $indices = array_keys($pages);
    shuffle($indices);
    // Nun die Ränge speichern - und die neue Abfolge der Seiten in $random   speichern
    $random = array();
    for ($i=0; $i<count($indices); $i++) {
        // Rang speichern wie oben
        $id = id('S002', $indices[$i] + 1);
        put($id, $i + 1);
        // Seite in der Abfolge speichern
        $random[$i] = $pages[$indices[$i]];
    }}
    
    //richtige Seite zum Weitermachen finden
    $random[] = 'EinleitungPKWvsBus';
    // Neue Seitenabfolge setzen
    setPageOrder($random);
    question('S003');  // ReihenfolgePKWBus
}

Beachten Sie die Zeile nach question('S003');. Dort stehen zwei schließende geschweifte Klammern und dann noch eine in der übernächsten Zeile. Das sind zwei mehr als Sie oben öffnen. Werfen Sie die beiden bitte mal raus.

Und weiter unten sehen Sie noch eine Zeile, wo erneut zwei schließende Klammern sind (}}), obwohl nur eine dort stehen sollte.

by s153384 (150 points)
Vielen Dank für die Antwort. Die Fehlermeldung ist jetzt auch nicht mehr da, dafür erscheint folgende Fehlermeldung:

In setPageOrder() wurde eine Seite "b1a" angegeben, die es im Fragebogen nicht gibt.

Diese Meldung erscheint fünfmal (also zu b1a,b2a,b3a,4a,b5a).

Woran könnte das liegen?

Schon mal vielen Dank!
by SoSci Survey (304k points)
Haben Sie die entsprechenden Seitenkennungen im Fragebogen definiert?
https://www.soscisurvey.de/help/doku.php/de:glossary#seitenkennung
by s153384 (150 points)
Ja, aber die Seitenkennungen sind z.B. "K1PVideo" und "b1a" soll keine Seitenkennung sein sondern eine Zusammefassung einer Reihenfolge von verschiedenen Seiten. Ist das verständlich? Also K!PVideo ist eine Seite, dann kommen mehrere Seiten und dann ist "K1PEND" auch eine Seite.
by SoSci Survey (304k points)
> "b1a" soll keine Seitenkennung sein sondern eine Zusammefassung einer Reihenfolge von verschiedenen Seiten.

Ja, das macht in der Tat Sinn :) Dann fehlt nur noch eine Übersetzung der Array-Schlüssel in die weiter oben in $parts definierten Inhalte.

Bitte ersetzen Sie die Zeile

$random[$i] = $pages[$indices[$i]];

wie folgt:

$partID = $pages[$indices[$i]];
$random[$i] = $parts[partID];

Der Teil ab $random = array() ist in beiden IF-Zweigen identisch. Das können Sie im Prinzip hinter das IF ziehen, dann brauchen Sie es nur einmal auszutauschen.
by s153384 (150 points)
Vielen Dank für die Hilfe. Das kann ich auch nachvollziehen. Ich habe jetzt auch die beiden Zeilen für die Zeile

$random[$i] = $pages[$indices[$i]];

ersetzt. Nun kommt aber folgende Fehlermeldungen:

Fehler im Fragebogen: Use of undefined constant partID - assumed 'partID' (this will throw an Error in a future version of PHP)

und

Fehler im Fragebogen: Undefined index: partID

Dabei wurde jeweils die Zeile

$random[$i] = $parts[partID];

rot markiert.

Woran könnte das liegen?
Vielen Dank schonmal.
by SoSci Survey (304k points)
Ach ja ... es fehlte noch ein Dollar-Zeichen vor dem partID (zweite Zeile):

$partID = $pages[$indices[$i]];
$random[$i] = $parts[$partID];

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

...