0 votes
in SoSci Survey (dt.) by s033075 (145 points)

Liebes SosciSurvey team,

Ich versuche eine genestete For-Schleife zu erstellen und stoße dabei auf das Problem, dass die innere Schleife nur ein Mal durchlaufen wird, statt so oft wie es die äussere Schleife vorsieht.

Unten ist eine Kurvzversion meiner jetzigen Schleife, welche das Problem reproduziert:

# Beteiligte Variablen
$rand_colors = array("redblue", "red-notblue", "notred-blue", "notred-notblue");
$rand_props = array("prop1", "prop2", "prop3", "prop4");
$redblue = array("red", "blue");
shuffle($rand_colors);
shuffle($rand_props);
shuffle($redblue);

# Die Schleife
for ($i == 0; $i < 4; $i++) { 
    $color[$i] = $rand_colors[$i];   # color-pair for each block
    $prop[$i] = $rand_props[$i];     # proportion-pair for each block
    for ($j == 0; $j < 8; $j++){
    $jar[$i] = $redblue[$i];         # jar for each block
            if ($jar[$i] == "blue"){                    
                $colors[$i][$j] = "redblue_blue";                                                         
            }
            elseif ($jar[$i] == "red"){                   
                $colors[$i][$j] = "redblue_red";
            }                        
    };
};

Das Output für die Variable $colors ist beim obigen Code ein Array aus 8 Elementen (d.h. die innere Schleife wird ein Mal durchlaufen). Mein Ziel ist aber, dass das Output 32 Elemente hat (8 Durchgänge der inneren Schleife für jedes der 4 Durchgänge der äusseren Schleife).

Ich freue mich über jeden Hinweis, wie die Schleife angepasst werden kann um dieses Ziel zu erreichen!

1 Answer

0 votes
by SoSci Survey (305k points)
selected by s033075
 
Best answer

Sie haben im Array $redblue nur zwei Elemente (Indizes 0 und 1), aber Ihre Variable $i läuft von 0 bis 3. Das heißt, dass bei 2 von 4 Durchgängen kein Wert gefunden wird, und entsprechend greift keiner der Filter im inneren Filter.

Außerdem haben Sie die Schleifen falsch definiert. Es ist nur eine Kleinigkeit, aber Sie haben geschrieben for ($j == 0; $j < 8; $j++) - und zwar mit doppeltem Gleichheitszeichen. Dadurch wird die Variable $j beim ersten Durchlauf nicht auf 0 gesetzt, sondern nur mit 0 verglichen. Vorsicht, das haben Sie bei beiden Schleifen.

by s033075 (145 points)
Vielen vielen Dank - diese Hinweise haben das Problem gelöst!
Ich hatte im Code "=" und "==" verwechselt, obwohl ich eigentlich den Unterschied in deren Bedeutung kenne. Ich hätte "=" in der For-Schleife verwenden sollen und "==" in der If-Schleife, statt dasselbe Symbol in der Definition beider Schleifen-Arten.
Außerdem hatte ich die Kurzversion des Codes falsch erstellt, so dass es das zusätzliche Problem zu kurzer Arrays gab (dieses Problem bestand im Ursprungscode nicht). Unten ist eine Version des obigen Beispiels, in dem diese Probleme (denke ich) nicht mehr bestehen und der Output dem entspricht, was ich suchte. Vielen Dank nochmal!

# Beteiligte Variablen
$rand_colors = array("redblue", "red-notblue", "notred-blue", "notred-notblue");
$rand_props = array("prop1", "prop2", "prop3", "prop4");
$redblue = array("red", "blue", "red", "blue");
shuffle($rand_colors);
shuffle($rand_props);
shuffle($redblue);

# Die Schleife
for ($i = 0; $i < 4; $i++) {
    $color[$i] = $rand_colors[$i];   
    $prop[$i] = $rand_props[$i];     
    for ($j = 0; $j < 8; $j++){
    $jar[$i] = $redblue[$i];         
            if ($jar[$i] == "blue"){                    
                $colors[$i][$j] = "redblue_blue";                                                         
            }
            elseif ($jar[$i] == "red"){                   
                $colors[$i][$j] = "redblue_red";
            }                        
    };
};

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

...