PHP: Geltungsbereich von Variablen in mehreren foreach
EDIT:
Problem gelöst, indem Sie $i+1 in Funktion aufrufen.
Habe ich Probleme mit Variablen in mehreren foreaches. Das problem commeth, wenn ich versuche, eine Funktion aufzurufen, innerhalb foreach. Wenn ich das tun die main-Schleife iterator-Wert ist plötzlich null (egal welche Runde es auf) aber wenn ich die Kommentar-Funktion Aufruf der iterator-Wert zeigt an, wie sollte es auch wieder.
Könnte mir jemand zeigen, um die richtige Richtung in den Zugriff auf Variablen in der folgenden Beispiele:
Dieser funktioniert wie es sollte
for($i=0; $i<3; $i++)
{
echo $i; //1, 2, 3
foreach($something as $value)
{
echo $i; //main loop's iterator value
foreach($value as $moreSomething)
{
echo $i; //main loop's iterator value
}
}
}
Aber das funktioniert nicht, iterator zeigt sich als eine 0.
for($i=0; $i<3; $i++)
{
echo $i; //1, 2, 3
foreach($something as $value)
{
echo $i; //0
foreach($value as $moreSomething)
{
echo $i; //0
$object->addStuff($i, $moreSomething); //i = 0, moreSomething is correct
}
}
}
BEARBEITEN:
Ich bin das hinzufügen von Beispielcode um das problem zu reproduzieren. Beachten Sie, dass dies ist, über das Verhalten $ich Wert, nicht die richtige Reihenfolge der Namen oder soetwas.
Ich bin nur besorgt, warum das $i ist der Wert plötzlich ändert. Vielleicht meiner Logik, aber sehen Sie selbst
(bei Verwendung von $i oder $b in addName () - Funktion $ich die Ausgabe 000000000012, wenn mit $ein dann $ich die Ausgabe ändert sich plötzlich zu 00000000001111111222)
class RockPaperScissors
{
private $nameArray;
//constructor
function RockPaperScissors ()
{
$this->nameArray = array();
}
function addName($level, $name)
{
$this->nameArray[$level][] = $name;
}
function getNames($level)
{
$array = array();
foreach ($this->nameArray as $key => $value)
{
if ($key == $level)
{
foreach ($value as $name)
{
$array[] = $name;
}
}
}
return $array;
}
function printArray()
{
print_r($this->nameArray);
}
}
function getNewNames($name)
{
$array = array();
switch ($name)
{
case "Mickey":
$array[] = "Morty";
$array[] = "Ferdie";
break;
case "Donald":
$array[] = "Houie";
$array[] = "Dewey";
$array[] = "Louie";
break;
case "Goofy":
$array[] = "Gilbert";
break;
case "Morty":
$array[] = "Morty-B";
break;
case "Ferdie":
$array[] = "Ferdie-B";
break;
case "Houie":
$array[] = "Houie-B";
break;
case "Dewey":
$array[] = "Dewey-B";
break;
case "Louie":
$array[] = "Louie-B";
break;
case "Gilbert":
$array[] = "Gilbert-B";
break;
}
return $array;
}
$MAX_LEVELS = 3;
$RPS = new RockPaperScissors();
$RPS->addName(0, "Mickey");
$RPS->addName(0, "Donald");
$RPS->addName(0, "Goofy");
$a = 0;
$b = 0;
for ($i=0; $i<$MAX_LEVELS; $i++)
{
$namesFromRPS = $RPS->getNames($i);
echo $i;
foreach($namesFromRPS as $name)
{
echo $i;
$newNames = getNewNames($name);
foreach($newNames as $newName)
{
echo $i;
//try switching $i to $a or $b and notice the behaviour change of $i
$RPS->addName($i, $newName);
}
$a++;
}
$b++;
}
//$RPS->printArray();
- So erhalten Sie eine Ausgabe der
1, 2, 3, 0, 0
? Das wäre sehr seltsam und schwer zu glauben. - Sie sind effektiv Aufruf
$object->addStuff($i, $moreSomething);
für jeden$moreSomehting
drei mal, jedes mal mit einem anderen$i
. Vielleicht haben Sie die Logik ist falsch. Was wollen Sie erreichen? - Konnte Sie zeigen, was
addStuff
ist zu tun? - der Ertrag ist mehr wie 0000000000012 wenn es nicht funktioniert und 0000000000111112222222, wenn es funktioniert. Beispiele sind etwas vereinfacht, tut mir Leid, aber ich kann den ganzen code, aber ich könnte schreiben, etwas zu reproduzieren. die addStuff fügt nur den Wert des Objekts eigenes array mit $this->arrayname[] = $moreSomething.
0000000000111112222222
?? Wenn es funktionieren würde, jede Zahl sollte so oft wie die anderen.1
scheint weniger oft.- Hinzugefügt Beispielcode
- Über Ihren Kommentar im code:
$a
mehr in die innere Schleife, also es steigt schneller als$i
.$b
und$i
sollten gleich sein. - Ich weiß, $a war es für debug-Gründen. Aber es stellt sich heraus, dass das problem liegt in der Logik. Die getNames nicht immer alle neue Namen und es gibt nichts zu tun in der foreach-Schleifen. Es war ein bisschen hart, um diese zu finden 😛
Du musst angemeldet sein, um einen Kommentar abzugeben.
foreach
Schleifen nicht haben Ihren eigenen Bereich.So ist die Arbeit erwartet wird:
Ich Wette ein Bier, dass die Schleifen funktionieren wie erwartet, aber es gibt nichts zu tun, für den inneren Schleifen, wenn
$i
erreicht1
.Nicht eine Reale Antwort, aber dein code ist eigentlich das gleiche wie:
Sind Sie sicher, dass diese Logik richtig ist? Was möchten Sie tun? Nicht zu wissen, was
addStuff
tut, es scheint ein wenig seltsam für Sie den gleichen Wert drei mal mit einem anderen index zu so etwas.Hier ist ein Beispiel mit einem Aufruf der Methode:
ausgegeben (wie erwartet):
So der Fehler muss woanders.
In Ihrem zweiten Beispiel
$i
wird 0 für die erste iteration der Basis-loop.Bleibt es auf 0 gesetzt für alle
$something
s und alle$value
s, dann wird es sich auf die nächste Basis-iteration, Einstellung$i
1 und so weiter...ich fügte hinzu, eine variable
$something
als 2d-Array$something = Array(1 => Array(1 => "1", 2 => "2"), 2 => Array(3 => "3", 4 => "4"))
Verwendung dieser, Ihr foreach zeigt nur feine:
Ich bin mir nicht sicher, aber es könnte etwas mit der Tatsache zu tun, dass
$i
definiert ist, innerhalb derfor()
Schleife. Ich würde versuchen, die Definition$i
kurz vor derfor()
loop definiert ist.James
Sehe ich kein problem mit der Ausführung dieses code hier: http://www.ideone.com/HsVDj