Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:多个foreach中的变量范围_Php_Variables_Loops_Scope_Foreach - Fatal编程技术网

PHP:多个foreach中的变量范围

PHP:多个foreach中的变量范围,php,variables,loops,scope,foreach,Php,Variables,Loops,Scope,Foreach,编辑: 通过在函数调用中使用$i+1解决了此问题 我在多个foreach中使用变量时遇到问题。当我试图调用foreach内部的函数时,问题就出现了。每当我这样做的时候,主循环的迭代器值突然为零,不管它在哪个圈上,但是当我注释掉函数调用时,迭代器值再次显示为它应该显示的值 在下面的例子中,有人能告诉我访问变量的正确方向吗 这是应该的 for($i=0; $i<3; $i++) { echo $i; // 1, 2, 3 foreach($something as $value

编辑: 通过在函数调用中使用$i+1解决了此问题

我在多个foreach中使用变量时遇到问题。当我试图调用foreach内部的函数时,问题就出现了。每当我这样做的时候,主循环的迭代器值突然为零,不管它在哪个圈上,但是当我注释掉函数调用时,迭代器值再次显示为它应该显示的值

在下面的例子中,有人能告诉我访问变量的正确方向吗

这是应该的

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 
        }
    }
}
但这不起作用,迭代器显示为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
        }
    }
}
编辑: 我正在添加示例代码来重现这个问题。注意,这是关于$i的值的行为,而不是名称的正确顺序或类似的东西。 我只是担心为什么$I的价值突然改变。也许是我的逻辑,但你自己看看吧

当在addName函数中使用$i或$b时,$i的输出为0000000000 12,当使用$a时,$i的输出突然变为0000000000 1111111 222

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();

我不确定,但这可能与$I是在for循环中定义的事实有关。我会在定义for循环之前尝试定义$I


James

我不确定,但这可能与$I是在for循环中定义的事实有关。我会在定义for循环之前尝试定义$I

James

foreach循环没有自己的作用域

预期的工作方式是:

Set $i to 0
 Enter the first foreach loop with `$i = 0`
  Enter the second foreach loop with `$i = 0`

Set $i to 1
 Enter the first foreach loop with `$i = 1`
  Enter the second foreach loop with `$i = 1`

etc.
我敢打赌,循环按预期工作,但当$I达到1时,内部循环就没有什么可做的了。

每个循环都没有自己的作用域

预期的工作方式是:

Set $i to 0
 Enter the first foreach loop with `$i = 0`
  Enter the second foreach loop with `$i = 0`

Set $i to 1
 Enter the first foreach loop with `$i = 1`
  Enter the second foreach loop with `$i = 1`

etc.
我敢打赌循环按预期工作,但当$I达到1时,内部循环没有任何作用。

在第二个示例中,对于基本循环的第一次迭代,$I将为0

对于所有$something和所有$value,它将保持设置为0,然后它将移动到下一个基本迭代,将$i设置为1,依此类推……

在第二个示例中,对于基本循环的第一个迭代,我将为0

对于所有$something和所有$value,它将保持设置为0,然后它将进入下一个基本迭代,将$i设置为1,依此类推……

我将变量$something添加为2d数组

$something=Array1=>Array1=>1,2=>2,2=>Array3=>3,4=>4

使用此选项,您的foreach显示得非常好:

000000011111112222222
我将变量$something添加为2d数组

$something=Array1=>Array1=>1,2=>2,2=>Array3=>3,4=>4

使用此选项,您的foreach显示得非常好:

000000011111112222222

不是真正的答案,但您的代码实际上与以下代码相同:

foreach($something as $value)
{
    foreach($value as $moreSomething)
    {
        for($i=0; $i<3; $i++)
        {
            $object->addStuff($i, $moreSomething); // i = 0, moreSomething is correct
        }
    }
}
按预期打印:

in for: 0
in 1. foreach: 0
in 2. foreach: 0
In function: i: 0 value: 1
in 2. foreach: 0
In function: i: 0 value: 2
in 1. foreach: 0
in 2. foreach: 0
In function: i: 0 value: 1
in 2. foreach: 0
In function: i: 0 value: 2
in for: 1
in 1. foreach: 1
in 2. foreach: 1
In function: i: 1 value: 1
in 2. foreach: 1
In function: i: 1 value: 2
in 1. foreach: 1
in 2. foreach: 1
In function: i: 1 value: 1
in 2. foreach: 1
In function: i: 1 value: 2
in for: 2
in 1. foreach: 2
in 2. foreach: 2
In function: i: 2 value: 1
in 2. foreach: 2
In function: i: 2 value: 2
in 1. foreach: 2
in 2. foreach: 2
In function: i: 2 value: 1
in 2. foreach: 2
In function: i: 2 value: 2

因此,错误一定在其他地方。

不是真正的答案,但您的代码实际上与以下代码相同:

foreach($something as $value)
{
    foreach($value as $moreSomething)
    {
        for($i=0; $i<3; $i++)
        {
            $object->addStuff($i, $moreSomething); // i = 0, moreSomething is correct
        }
    }
}
按预期打印:

in for: 0
in 1. foreach: 0
in 2. foreach: 0
In function: i: 0 value: 1
in 2. foreach: 0
In function: i: 0 value: 2
in 1. foreach: 0
in 2. foreach: 0
In function: i: 0 value: 1
in 2. foreach: 0
In function: i: 0 value: 2
in for: 1
in 1. foreach: 1
in 2. foreach: 1
In function: i: 1 value: 1
in 2. foreach: 1
In function: i: 1 value: 2
in 1. foreach: 1
in 2. foreach: 1
In function: i: 1 value: 1
in 2. foreach: 1
In function: i: 1 value: 2
in for: 2
in 1. foreach: 2
in 2. foreach: 2
In function: i: 2 value: 1
in 2. foreach: 2
In function: i: 2 value: 2
in 1. foreach: 2
in 2. foreach: 2
In function: i: 2 value: 1
in 2. foreach: 2
In function: i: 2 value: 2
所以这个错误肯定在别的地方

我认为在这里执行此代码没有问题:


我发现在这里执行这段代码没有问题:

那么您得到的输出是1、2、3、0、0?这很奇怪,也很难相信。你实际上是在调用$object->addStuff$i,$moreSomething;每多三次,每次使用不同的$i。也许你的逻辑是错误的。你想实现什么?你能展示addStuff在做什么吗?@pekka当它不工作时,输出更像0000000000012,当它工作时,输出更像0000000000 11111 2222222。示例有点简化,很抱歉,我可以展示整个代码,但我可以编写一些东西来重现它。addStuff仅使用$this->arrayname[]=$moreSomething.0000000000 11111 2222222将值添加到对象的私有数组中??如果它能起作用,每个数字应该和其他数字一样频繁。1似乎不太经常出现。所以您得到的输出是1、2、3、0、0?这很奇怪,也很难相信。你实际上是在调用$object->addStuff$i,$moreSomething;每多三次,每次使用不同的$i。也许你的逻辑是错误的。你想实现什么?你能展示addStuff在做什么吗?@pekka当它不工作时,输出更像0000000000012,当它工作时,输出更像0000000000 11111 2222222。示例有点简化,很抱歉,我可以展示整个代码,但我可以编写一些东西来重现它。addStuff仅使用$this->arrayname[]=$moreSomething.0000000000 11111 2222222将值添加到对象的私有数组中??如果它能起作用,每个数字应该和其他数字一样频繁。1似乎不太经常出现。不,这没有效果$我是在for循环中定义的,也就是说这没有帮助。我试过使用$a=0;在基本for循环之前,在基本循环结束时对其进行+++,但它也显示为0Nope,这将没有任何效果$我是在for循环中定义的,也就是说这没有帮助。我试过使用$a=0;在base for循环之前,并在base循环的末尾对其进行+++,但是它也显示为0是的,这是它应该做的,但是它保持为0,无论基循环如何
op的迭代是。当基本迭代的计数变为1时,foreaches中的迭代器仍然保持为0,这就是问题所在。只有当我尝试在函数中使用它时才会发生这种情况。是的,它应该这样做,但无论基循环的迭代是什么,它都保持为0。当基本迭代的计数变为1时,foreaches中的迭代器仍然保持为0,这就是问题所在。只有当我尝试在函数中使用它时,才会出现这种情况。我的头对于所有的循环旋转仍然有点模糊,但我相当确定这是事实。谢谢:PMy的头部仍然有点模糊的所有循环旋转,但我相当肯定,这是情况。谢谢:P