【发布时间】:2011-05-26 11:28:11
【问题描述】:
编辑:
在函数调用中使用 $i+1 解决了问题。
我在多个 foreaches 中使用变量时遇到问题。当我尝试在 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的输出为000000000012,使用$a时$i的输出突然变为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();
【问题讨论】:
-
所以你得到
1, 2, 3, 0, 0的输出?那会很奇怪,很难相信。 -
您有效地为每个
$moreSomehting调用$object->addStuff($i, $moreSomething);三次,每次都使用不同的$i。也许你的逻辑是错误的。你想达到什么目标? -
你能告诉我
addStuff在做什么吗? -
@pekka 当它不工作时输出更像 0000000000012 和 0000000000111112222222 当它工作时。例子有点简化,对不起,我可以展示整个代码,但我可以写一些东西来重现它。 addStuff 仅使用 $this->arrayname[] = $moreSomething 将值添加到对象的私有数组中。
-
0000000000111112222222??如果可行,每个数字都应该和其他数字一样频繁。1似乎不常出现。
标签: php variables loops scope foreach