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 😛

InformationsquelleAutor Seerumi | 2010-12-16
Schreibe einen Kommentar