0 votes
in SoSci Survey (dt.) by s047711 (250 points)

Ich möchte die beiden Maximalwerte aus einer Skala auslesen. Dann sollen entsprechende Pfade verfolgt werden, je nach Kombination der beiden. Das hatte soweit auch funktioniert.
Dann gab es das Problem, dass bei gleichen Platzierungen der Werte auf der Skala (ob das nun auf Platz 1 oder 2 war), zufällig ausgewählt werden soll, welchem nun Platz 1 oder Platz 2 (je nachdem wo der Gleichstand besteht) zugewiesen werden soll. Um das zu lösen, wurde ein Shuffle-Befehl eingebaut. Jetzt funktioniert das ursprüngliche Auslesen nach Platzierungen nicht mehr, sondern es wird nur noch zufällig gemischt.
Ich hoffe, dass ich es soweit verständlich erklärt habe.

Meine Frage ist nun, wie ich es hinbekomme, weiterhin entsprechend zu filtern (siehe GoToPage-Befehle) und nur bei Gleichstand zu shuffeln.

$SumSoz = valueSum(
         $Sozial = array(
           'SK02_01',
           'SK02_02',
           'SK02_03',
           'SK02_04',
         )
       );

$SumVer = valueSum(
         $Verbal = array(
           'SK02_05',
           'SK02_06',
           'SK02_07',
           'SK02_08',
         )
       );
$SumLog = valueSum(
         $Logisch = array(
           'SK02_09',
           'SK02_10',
           'SK02_11',
           'SK02_12',
         )
       );

$SumKre = valueSum(
         $Kreativ = array(
           'SK02_13',
           'SK02_14',
           'SK02_15',
           'SK02_16',
         )
       );



$sumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
$max = max($sumArray);
$maxis = array();
foreach ($sumArray as $code => $value) {
  if ($value == $max) {
    $maxis[] = $code;
  }
}
shuffle($maxis); debug($maxis);
$use = $maxis[0];



if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Soz")
) { 
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, VE01-VE68, WF03');
 
}


if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Ver")
) {
  setPageOrder('VE01-VE68, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
  
}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Soz")
) {
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, KR01-KR14, WF03');
   
}

if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Kre")
) {
  setPageOrder('KR01-KR14, WF07, SE01-SE11, SE20, SE12-SE19, WF03');

}

if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Kre")
) {
  setPageOrder ('KR01-KR14, WF07, VE01-VE68, WF03');

}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Ver")
) {
  setPageOrder ('VE01-VE68, WF07, KR01-KR14, WF03');
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Ver")
) {
  setPageOrder ('VE01- VE68, WF07, LM01-LM13, WF03'); 
  
}

if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, VE01-VE68, WF03'); 
  
}

if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, SE01-SE11, SE20, SE12-SE19, WF03'); 
  
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Soz")
) {
  setPageOrder ('SE01-SE11, SE20, SE12-SE19, WF07, LM01-LM13, WF03'); 
   
  
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Kre")
) {
  setPageOrder ('KR01-KR14, WF07, LM01-LM13, WF03'); 
  
}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, KR01-KR14, WF03'); 
  
}
by SoSci Survey (302k points)
edited by SoSci Survey
Bitte fügen Sie unter `$maxis = array()` folgende Zeile ein:

`debug($subArray);`
`debug($max);`

Bitte posten Sie dann, was im Debug-Modus alles als Info für die debug()-Zeilen erscheint. Danke.
by s047711 (250 points)
Ja genau, die ist eigentlich mit drin.

Das habe ich gemacht. Dann erscheint:

Debug-Information für $sumArray:
Soz16, Ver16, Log16, Kre16

Debug-Information für $max:
$max = 16 (double)

Debug-Information für $maxis:
0Log, 1Kre, 2Ver, 3Soz

Sieht eigentlich korrekt aus?

Dazu muss ich allerdings auch sagen, dass es beim Testen im Programm meistens funktioniert hat, aber nicht beim externen Zugriff, also beim Pretest mit Probanden.
by s047711 (250 points)
Ah, etwas Wichtiges habe ich vergessen.
Das Ergebnis der Rangreihe (ggbf. plus Shuffle) brauche ich später im Fragebogen noch einmal. Und zwar soll noch einmal, je nach dem vorher verfolgten Pfad + abhängig von einer Urnenziehung gefiltert werden.
Soweit ich weiß, werden die Ergebnisse des Mischens nicht gespeichert. Gibt es hierfür eine Lösung?

3 Answers

0 votes
by SoSci Survey (302k points)

Soz16, Ver16, Log16, Kre16

Okay, dann stimmt hier etwas nicht.

Lassen Sie als erstes bitte einmal die zusätzlichen Variablen-Deklarationen in valueSum() weg, also nur

$SumSoz = valueSum(
     array(
       'SK02_01',
       'SK02_02',
       'SK02_03',
       'SK02_04'
     )
   );

Und dann posten Sie bitte doch einmal die komplette Debug-Information - insbesondere, was in den Variablen SK02_01 bis SK02_04 denn eigentlich so gespeichert wurde. Kommt da wirklich die Summe 16 heraus?

Das Ergebnis der Rangreihe (ggf. plus Shuffle) brauche ich später im Fragebogen noch einmal.

Nun, das können Sie einfach in eine interne Variable speichern, wenn Sie also eine entsprechende Frage mit 4 Items haben, dann:

foreach ($maxis as $i => $code) {
  put(id('IV01', $i + 1), $code);
}
by s047711 (250 points)
Das stimmt schon so, das kommt raus, wenn man beliebig ankreuzt bei der Skala aus deren Werten heraus gefiltert werden soll.
Eben, mit anderem beliebigen Ankreuzen kam heraus:

Debug-Information für $sumArray:
Soz12, Ver8, Log10, Kre8
Debug-Information für $max:
$max = 12 (double)
Debug-Information für $maxis:
0Soz

D.h. ausgezählt wird vermutlich richtig.

Allerdings erscheint dann folgende Fehlermeldung:

PHP-Code

061
062 if (
063   ($maxis[0] == "Soz") and
064   ($maxis[1] == "Ver")
065 ) {
066   setPageOrder('VE01-VE68, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
067   

Fehler im Fragebogen: Undefined offset: 1
Zeile: 80

PHP-Code

077
078 if (
079   ($maxis[0] == "Soz") and
080   ($maxis[1] == "Kre")
081 ) {
082   setPageOrder('KR01-KR14, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
083

Fehler im Fragebogen: Undefined offset: 1
Zeile: 119

PHP-Code

116
117 if (
118   ($maxis[0] == "Soz") and
119   ($maxis[1] == "Log")
120 ) {
121   setPageOrder ('LM01-LM13, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
122   

Es liegt wohl daran, dass $maxis[1] nicht definiert ist. Wenn ich aber $use = $maxis[1] einsetze, dann kommt dieselbe Fehlermeldung.
by SoSci Survey (302k points)
Möchten Sie auf die Subskala mit dem höchsten Wert setzen oder soll auch eine Skala mit geringerem Wert auf Platz 2 "mitgenommen" werden?

In dem Fall würden Sie schreiben:

// ...
$sumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
debug($sumArray);
shuffle($sumArray);
arsort($sumArray);
$maxis = array_keys($sumArray);
debug($maxis);
by s047711 (250 points)
Ich habe meine Antwort als "Antwort" gepostet, um es Übersichtlicher zu machen, da einiges an Code drinnen steckt
0 votes
by s047711 (250 points)

Ja genau, das meinte ich. Die höchste und die zweithöchste Skala sollen mitgenommen und später mehrmals verwendet werden. Wenn zwei oder mehrere "punktgleich" auf Rang 1 liegen, sollen Rang 1 + 2 komplett zufällig zugewiesen werden. Wenn Rang 1 eindeutig ist und bei Rang 2 Gleichstand besteht, dann soll Rang 2 unter den entsprechenden Kandidaten zufällig zugewiesen werden.

Jetzt bin ich verwirrt. War das mit dem Code so gemeint?

$SumSoz = valueSum(
         $Sozial = array(
           'SK02_01',
           'SK02_02',
           'SK02_03',
           'SK02_04',
         )
       );

$SumVer = valueSum(
         $Verbal = array(
           'SK02_05',
           'SK02_06',
           'SK02_07',
           'SK02_08',
         )
       );
$SumLog = valueSum(
         $Logisch = array(
           'SK02_09',
           'SK02_10',
           'SK02_11',
           'SK02_12',
         )
       );

$SumKre = valueSum(
         $Kreativ = array(
           'SK02_13',
           'SK02_14',
           'SK02_15',
           'SK02_16',
         )
       );



$sumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
debug($sumArray);
shuffle($sumArray);
asort($sumArray);
$maxis = array_keys($sumArray);
debug($maxis);
shuffle($maxis);



if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Soz")
) { 
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, VE01-VE68, WF03');
 
}


if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Ver")
) {
  setPageOrder('VE01-VE68, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
  
}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Soz")
) {
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, KR01-KR14, WF03');
   
}

if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Kre")
) {
  setPageOrder('KR01-KR14, WF07, SE01-SE11, SE20, SE12-SE19, WF03');

}

if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Kre")
) {
  setPageOrder ('KR01-KR14, WF07, VE01-VE68, WF03');

}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Ver")
) {
  setPageOrder ('VE01-VE68, WF07, KR01-KR14, WF03');
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Ver")
) {
  setPageOrder ('VE01- VE68, WF07, LM01-LM13, WF03'); 
  
}

if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, VE01-VE68, WF03'); 
  
}

if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, SE01-SE11, SE20, SE12-SE19, WF03'); 
  
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Soz")
) {
  setPageOrder ('SE01-SE11, SE20, SE12-SE19, WF07, LM01-LM13, WF03'); 
   
  
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Kre")
) {
  setPageOrder ('KR01-KR14, WF07, LM01-LM13, WF03'); 
  
}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, KR01-KR14, WF03'); 
  
}

Jetzt wird nicht mehr gefiltert und es erscheint folgende Debug-Info:

Debug-Information für $sumArray: Soz14, Ver11, Log12, Kre10
Hinweis (Seite 5)
Debug-Information für $maxis:
00, 11, 22, 33

Ich hatte dieses Problem (Nach Rang 1 + 2 filtern) schon mal gelöst (siehe folgender Code). Damals war nur das Problem bei Gleichstand geblieben (was tun, wenn zwei oder mehr Skalen denselben Wert aufweisen?).

$SumSoz = valueSum(
         $Sozial = array(
           'SK02_01',
           'SK02_02',
           'SK02_03',
           'SK02_04',
         )
       );

$SumVer = valueSum(
         $Verbal = array(
           'SK02_05',
           'SK02_06',
           'SK02_07',
           'SK02_08',
         )
       );
$SumLog = valueSum(
         $Logisch = array(
           'SK02_09',
           'SK02_10',
           'SK02_11',
           'SK02_12',
         )
       );

$SumKre = valueSum(
         $Kreativ = array(
           'SK02_13',
           'SK02_14',
           'SK02_15',
           'SK02_16',
         )
       );



// Sortiere mir alle Summen und geben sie mir aus
$SumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
arsort($SumArray);
$Dim1 = array_keys($SumArray)[0];
$Dim2 = array_keys($SumArray)[1];


if (
  ($Dim1 == "Ver") and
  ($Dim2 == "Soz")
) { 
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, VE01-VE05, WF03');
 
}


if (
  ($Dim1 == "Soz") and
  ($Dim2 == "Ver")
) {
  setPageOrder('VE01-VE05, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
  
}
by SoSci Survey (302k points)
edited by SoSci Survey
> Jetzt bin ich verwirrt. War das mit dem Code so gemeint?

Alles über $sumArray bleibt, alles darunter wäre durch den con mit oben kommenteirten Code zu ersetzen.

Soweit ich sehe, haben Sie das gemacht. Allerdings ist der Inhalte vo $maixs falsch. Ich hatte nicht bedacht, dass shuffle() die Zuordnung von Schlüsseln zu Werten löscht. Kein Problem ...

$sumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
debug($sumArray);
// Mischen unter Beibehaltung der Zuordnung
$sumKeys = array_keys($sumArray);
shuffle($sumKeys);
$sumMixed = array();
foreach ($sumKeys as $key) {
  $sumMixed[$key] = $sumArray[$key];
}
// Nach dem Mischen wird sortiert
arsort($sumMixed);
$maxis = array_keys($sumMixed);
debug($maxis);
shuffle($maxis);
by s047711 (250 points)
Tut mir leid, aber ich stehe offenbar sehr auf dem Schlauch..
Wenn ich das mache und - als Bsp. - folgende Werte ausgezählt wurden

Debug-Information für $sumArray:
Soz11, Ver13, Log14, Kre12

, dann mischt er komplett zufällig, also ganz unabhängig von den Platzierungen. Diese sollen ja nach den tatsächlichen Werten, also den Antworten der Probanden, erstellt werden (und das Mischen ist nur für einen eventuellen Gleichstand gedacht).

Muss ich die Go To Page-Befehle noch anders definieren?
by SoSci Survey (302k points)
Posten Sie die Debug-Information? Dann kann ich das besser beurteilen.

Ich habe gerade noch gesehen, dass ich `asort()` geschrieben hatte. Sie bekommen mithin die beiden Items mi dem geringsten Score. Bitte eretzen Sie das noch durch `arsort()`.

Von der Logik: Erst wird zufällig gemischt und dann nach Wert sortiert. So sorgt man dafür, dass bei Gleichstand nachher dennoch gemischt ist (zwischen den Items wo Gleichstand herrscht).
by s047711 (250 points)
Nochma nach Antworten auf der vorherigen Skala, die Debug-Info:

Debug-Information für $sumArray:
Soz12, Ver10, Log14, Kre10

Debug-Information für $maxis:
0Log, 1Soz, 2Ver, 3Kre

Es müsste also folgender Set Page Order-Befehl gelten:

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Soz")
) {
  setPageOrder ('SE01-SE11, SE20, SE12-SE19, WF07, LM01-LM13, WF03');



Stattdessen sagt mir debug auch:

    Entsprechend setPageOrder() werden nun folgende Seiten gezeigt:
6 [LM01], 7, 8, 9, 10, 11, 12, 13, 14, 15 [LM13], 16 [WF07], 85 [KR01], 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101 [KR14], 122 [WF03]
by SoSci Survey (302k points)
Lassen Sie sich doch bitte $maxis[0] und $maxis[1] noch per debug() ausgeben. Nur zur Sicherheit. Und bitte direkt über den IF-Filtern - nicht, dass da noch alte Code-Fragmente das schöne Konstrukt wieder durcheinander bringen.
by s047711 (250 points)
Sowohl bei $maxis[0] als auch $maxis[1]  steht:
 "Keine Daten (null)"
by SoSci Survey (302k points)
Möchten Sie vielleicht einmal den kompletten aktuellen PHP-Code posten? Stellen Sie bitte auf jeden Fall sicher, dass das alles in einem PHP-Code Elements steht, nicht verteilt auf mehrere.
by s047711 (250 points)
Ok, ich schreibe es als Antwort auf den Originalbeitrag.
0 votes
by s047711 (250 points)
$SumSoz = valueSum(
         $Sozial = array(
           'SK02_01',
           'SK02_02',
           'SK02_03',
           'SK02_04',
         )
       );

$SumVer = valueSum(
         $Verbal = array(
           'SK02_05',
           'SK02_06',
           'SK02_07',
           'SK02_08',
         )
       );
$SumLog = valueSum(
         $Logisch = array(
           'SK02_09',
           'SK02_10',
           'SK02_11',
           'SK02_12',
         )
       );

$SumKre = valueSum(
         $Kreativ = array(
           'SK02_13',
           'SK02_14',
           'SK02_15',
           'SK02_16',
         )
       );


$sumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
debug($sumArray);
// Mischen unter Beibehaltung der Zuordnung
$sumKeys = array_keys($sumArray);
shuffle($sumKeys);
$sumMixed = array();
foreach ($sumKeys as $key) {
  $sumMixed[$key] = $sumArray[$key];
}
// Nach dem Mischen wird sortiert
arsort($sumMixed);
$maxis = array_keys($sumMixed);
debug($maxis);
shuffle($maxis);
debug($maxis0);
debug($maxis1);





if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Soz")
) { 
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, VE01-VE68, WF03');
 
}


if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Ver")
) {
  setPageOrder('VE01-VE68, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
  
}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Soz")
) {
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, KR01-KR14, WF03');
   
}

if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Kre")
) {
  setPageOrder('KR01-KR14, WF07, SE01-SE11, SE20, SE12-SE19, WF03');

}

if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Kre")
) {
  setPageOrder ('KR01-KR14, WF07, VE01-VE68, WF03');

}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Ver")
) {
  setPageOrder ('VE01-VE68, WF07, KR01-KR14, WF03');
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Ver")
) {
  setPageOrder ('VE01- VE68, WF07, LM01-LM13, WF03'); 
  
}

if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, VE01-VE68, WF03'); 
  
}

if (
  ($maxis[0] == "Soz") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, SE01-SE11, SE20, SE12-SE19, WF03'); 
  
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Soz")
) {
  setPageOrder ('SE01-SE11, SE20, SE12-SE19, WF07, LM01-LM13, WF03'); 
   
  
}

if (
  ($maxis[0] == "Log") and
  ($maxis[1] == "Kre")
) {
  setPageOrder ('KR01-KR14, WF07, LM01-LM13, WF03'); 
  
}

if (
  ($maxis[0] == "Kre") and
  ($maxis[1] == "Log")
) {
  setPageOrder ('LM01-LM13, WF07, KR01-KR14, WF03'); 
  
}
by SoSci Survey (302k points)
Das letzte shuffle($maxis); vor debug($maxis0); muss raus. Und beim anschließenden debug() fehlen die eckigen Klammern, also debug($maxis[0]); statt debug($maxis0); - aber die debug() Zeilen können am Ende dann ohnehin raus.

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

...